私が発見した方法は1つありますが、それは少し斜視です。ジェネリックスとオーバーロードはビルド時に解決されるため、ジェネリックメソッドを定義できます。
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
string