Я також шукав шаблон для імітації спеціалізації на шаблонах. Є деякі підходи, які можуть спрацювати за певних обставин. Однак як щодо справи
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
.