如何使用泛型类型参数和'as'运算符来转换变量

时间:2016-02-08 09:56:02

标签: c# .net generics

我有一个在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泛型参数作为新类型转换对象的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

好吧,如果parameter as TOut返回null,则parameter的运行时类型不是TOut

不要忘记运算符解析是在编译时完成的,因此如果定义了转换运算符,它们将在此处调用。如果确实需要,可以使用dynamic

public static Foo<TOut> InputAs<TOut>(dynamic parameter) 
{    
    return new Foo<TOut>((TOut)parameter);
}

这将允许运行时操作员解析,并且如果可用,将调用您的强制转换操作符。例如,它允许您传递long,同时期待int

但是,您可能希望找到一种与您尝试做的不同的方式; dynamic非常有用,但它也可以使调试变得更加困难,并且几乎所有的编译时警告和错误都可以帮助您在问题发生之前发现它们。