You need a subclass. Recently I needed something like that, this is my solution:
public abstract class MyGenericClass<T1, T2>
{
public abstract void Do(T1 param1, T2 param2);
}
public class Concrete : MyGenericClass<string, int?>
{
public override void Do(string param1, int? param2 = null)
{
Console.WriteLine("param1: {0}", param1);
if (param2 == null)
Console.WriteLine("param2 == null");
else
Console.WriteLine("param2 = {0}", param2);
Console.WriteLine("=============================================");
}
}
You can call the method:
string param1 = "Hello";
Concrete c = new Concrete();
c.Do(param1);
c.Do(param1, 123);
c.Do(param1, (int?)null);
/* Result:
param1: Hello
param2 == null
=============================================
param1: Hello
param2 = 123
=============================================
param1: Hello
param2 == null
=============================================
*/
I prefer to use null default values since i read this:
C# In Depth – Optional Parameters and Named Arguments
ValueType
, but by using thestruct
keyword.)