Существует один способ, который я только что открыл, но он немного перекрестим. Поскольку родовые и перегрузка разрешаются во время сборки, вы можете определить общий метод:
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
во время выполнения.
Странно, но прекрасно в то же время! – Jay
Это должен был быть принятый ответ! – Jay