C# 如何使用泛型类型参数和';as';操作人员

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

我有下面的通用静态类,它正在fluentapi中使用。它接受一个输入参数并返回一个包装类,其中包含转换为泛型类型的参数:

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接口{