Почему я должен предоставлять явно общие типы параметров. В то время как компилятор должен вывести тип?
public static T2 Cast<T1,T2>(this T1 arg) where T2 : class where T1 : class
{
return arg as T2;
}
Пример использования:
objOfTypeT2 = objOfTypeT1.Cast<TypeT1,TypeT2>();
По сравнению с моим желаемым использованием с более интеллектуальный компилятор:
objOfTypeT2 = objOfTypeT1.Cast<TypeT2>();
или, может быть, я должен быть более умным: -)
Остерегайтесь предоставления типа возврата. Я хочу не предоставлять объект, который я назвал функцией на нем, метод - это метод расширения.
Я использовал решение Marc Gravell и, как и он, но я могу представить еще одну альтернативу.
Поскольку общие параметры выводятся из параметров, другой вариант заключается в том, чтобы вместо этого использовать параметр out для результата возвращаемого значения.
Это было возможно в течение длительного времени, но сегодняшний C # позволяет объявлять переменную inline, которую я считаю полезным для использования.
public static void Cast<T1, T2>(this T1 arg, out T2 result) where T2 : class where T1 : class
{
result = arg as T2;
}
Вы можете назвать это следующим образом
objOfTypeT1.Cast(out Type2 objOfTypeT2);
Вывод не учитывает тип возврата; вы можете, однако, попытаться разделить дженерики; например, вы могли бы написать код, чтобы разрешить:
.Cast().To<Type2>()
, имея (непроверенный, только указательный)
public static CastHelper<T> Cast<T>(this T obj) {
return new CastHelper<T>(obj);
}
public struct CastHelper<TFrom> {
private readonly TFrom obj;
public CastHelper(TFrom obj) { this.obj = obj;}
public TTo To<TTo>() {
// your code here
}
}