我有以下通用静态类,它正在Fluent API中使用。它接受一个输入参数,并返回一个包装类,其中包含对泛型类型的参数强制转换。
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);
}
问题是castParameter == null
检查总是返回 null
. 使用 TOut
泛型参数作为新类型强制转换对象的正确方法是什么?
好吧,如果parameter as TOut
返回null
,则parameter
的运行时类型不是TOut
。
解析是在编译时完成的,因此,如果定义了强制转换运算符,则不会在此处调用它们。如果你确实需要它,你可以使用dynamic
:
public static Foo<TOut> InputAs<TOut>(dynamic parameter)
{
return new Foo<TOut>((TOut)parameter);
}
这将允许运行时运算符解析,并将调用转换运算符(如果可用)。例如,它将允许您通过 long
,同时期待int
.
但是,您可能想找到一种不同的方法来尝试执行操作; dynamic
可能非常有用,但它也会使调试变得更加困难,并且您几乎会丢失所有编译时警告和错误,这些警告和错误可以帮助您在问题发生之前识别问题。