C# 如何使用泛型类型参数和';as';操作人员
我有下面的通用静态类,它正在fluentapi中使用。它接受一个输入参数并返回一个包装类,其中包含转换为泛型类型的参数:C# 如何使用泛型类型参数和';as';操作人员,c#,.net,generics,C#,.net,Generics,我有下面的通用静态类,它正在fluentapi中使用。它接受一个输入参数并返回一个包装类,其中包含转换为泛型类型的参数: public static Foo<TOut> InputAs<TOut>(object parameter) { var castParameter = parameter as TOut; if(castParameter == null) { throw new Exception("Invalid cast
public static Foo<TOut> InputAs<TOut>(object parameter) {
var castParameter = parameter as TOut;
if(castParameter == null) {
throw new Exception("Invalid cast");
}
return new Foo<TOut>(castParameter);
}
公共静态Foo输入(对象参数){
var castParameter=作为TOut的参数;
if(castParameter==null){
抛出新异常(“无效强制转换”);
}
返回新的Foo(castParameter);
}
问题是
castParameter==null
检查总是返回null
。使用TOut
泛型参数作为新类型强制转换对象的正确方法是什么?如果parameter as TOut
返回null
,那么parameter
的运行时类型就不是TOut
不要忘记操作符解析是在编译时完成的,所以如果您已经定义了cast操作符,它们将不会在这里被调用。如果确实需要,可以使用动态:
public static Foo<TOut> InputAs<TOut>(dynamic parameter)
{
return new Foo<TOut>((TOut)parameter);
}
公共静态Foo输入(动态参数)
{
返回新的Foo((TOut)参数);
}
这将允许运行时操作符解析,并将调用您的cast操作符(如果有)。例如,它将允许您传递long
,同时期望int
然而,你可能想找到一种不同的方式来做你想做的事情<代码>动态
可能非常有用,但它也会使调试变得更加困难,并且会丢失几乎所有的编译时警告和错误,这些警告和错误可以帮助您在问题发生之前识别问题。为什么不:公共静态Foo InputAs(TOut参数){
?这样,您可以强制输入参数为预期类型。如果需要基类,您可以使用限制扩展它:publicstaticfoo-InputAs(TOut参数),其中TOut:isome接口{