我刚刚发现了一种方法,但有点眼花缭乱。因为泛型和重载在构建时得到解决,你可以定义一个泛型方法:
public static CallerClass
{
public static CallGenericOverload<T>(GenericClass<T> cls, T val)
{
return cls.ProblemOverload(val);
}
//We can also make an extension method.
//We don't have to of course, it's just more comfortable this way.
public static CallGenericOverloadExtension<T>(this GenericClass<T> cls, T val)
{
return cls.ProblemOverload(val);
}
}
public GenericClass<T>
{
public string ProblemOverload(T val)
{
return "ProblemOverload(T val)";
}
public string ProblemOverload(string val)
{
return "ProblemOverload(string val)";
}
}
现在,如果我们执行以下操作:
var genClass = new GenericClass<string>();
Console.WriteLine(genClass.ProblemOverload("")); //output: ProblemOverload(string val)
Console.WriteLine(CallerClass.CallGenericOverload(genClass, "")); //output: ProblemOverload(T val)
Console.WriteLine(genClass.CallGenericOverloadExtension("")); //output: ProblemOverload(T val)
如果定义泛型类而不是泛型方法,则可以使用类似的技巧。重要的是您传输到的参数ProblemOverload
需要是类型T
而不是string
调用中的类型。毕竟,该方法CallGenericOverload
知道它T
在构建时得到 a,因此它将绑定到接受参数的重载。它实际上会string
在运行时得到 a 并不重要。