Tôi cũng đang tìm kiếm một mẫu để mô phỏng chuyên môn hóa mẫu. Có một số cách tiếp cận có thể hiệu quả trong một số trường hợp. Tuy nhiên những gì về trường hợp
static void Add<T>(T value1, T value2)
{
}
Có thể chọn hành động bằng cách sử dụng các câu lệnh, ví dụ if (typeof(T) == typeof(int))
. Nhưng có một cách tốt hơn để mô phỏng chuyên môn hóa mẫu thực với chi phí của một lệnh gọi hàm ảo duy nhất:
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;
}
}
Bây giờ chúng ta có thể viết mà không cần phải biết trước loại:
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;
}
Nếu chuyên môn hóa không chỉ được gọi cho các kiểu được triển khai mà còn cả các kiểu dẫn xuất, người ta có thể sử dụng một In
tham số cho giao diện. Tuy nhiên, trong trường hợp này, kiểu trả về của các phương thức không thể thuộc kiểu chung T
nữa.