Я тоже искал шаблон для имитации специализации шаблона. Есть несколько подходов, которые могут работать при определенных обстоятельствах. Однако как насчет дела
static void Add<T>(T value1, T value2)
{
}
Можно было бы выбрать действие с помощью операторов, например if (typeof(T) == typeof(int))
. Но есть лучший способ смоделировать реальную специализацию шаблона с накладными расходами на один вызов виртуальной функции:
public interface IMath<T>
{
T Add(T value1, T value2);
}
public class Math<T> : IMath<T>
{
public static readonly IMath<T> P = Math.P as IMath<T> ?? new Math<T>();
T IMath<T>.Add(T value1, T value2)
{
throw new NotSupportedException();
}
}
class Math : IMath<int>, IMath<double>
{
public static Math P = new Math();
int IMath<int>.Add(int value1, int value2)
{
return value1 + value2;
}
double IMath<double>.Add(double value1, double value2)
{
return value1 + value2;
}
}
Теперь мы можем писать, не зная заранее тип:
static T Add<T>(T value1, T value2)
{
return Math<T>.P.Add(value1, value2);
}
private static void Main(string[] args)
{
var result1 = Add(1, 2);
var result2 = Add(1.5, 2.5);
return;
}
Если специализацию следует вызывать не только для реализованных типов, но и для производных типов, можно использовать In
параметр для интерфейса. Однако в этом случае возвращаемые типы методов больше не могут быть универсального типа T
.