【问题标题】:How to Cast A Variable Using Generic Type Parameter and 'as' Operator如何使用泛型类型参数和“as”运算符强制转换变量
【发布时间】:2016-02-08 09:56:01
【问题描述】:

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

【问题讨论】:

  • 为什么不:public static Foo&lt;TOut&gt; InputAs&lt;TOut&gt;(TOut parameter) {?像这样,您可以强制输入参数为预期类型。如果你需要一个基类,你可以有限制地扩展它:public static Foo&lt;TOut&gt; InputAs&lt;TOut&gt;(TOut parameter) where TOut : ISomeInterface {

标签: c# .net generics


【解决方案1】:

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

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

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

这将允许运行时运算符解析,并且如果有可用的转换运算符,将调用它。例如,它允许你传递long,而期望int

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

【讨论】:

    猜你喜欢
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2014-02-16
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多