如何检查值是否可以转换为泛型类型?

时间:2012-03-16 16:33:20

标签: c# generics types casting nullable

我有一个包装一些外部API调用的方法,通常会返回null。如果是这样,我想返回default值。该方法看起来像这样

public static T GetValue<T>(int input)
{
    object value = ExternalGetValue(input);
    return value != null ? (T)value : default(T)
}

问题是(T)value可能会抛出无效的强制转换异常。所以我想我会把它改成

    var value = ExternalGetValue(input) as Nullable<T>;

但这需要where T : struct,我也希望允许引用类型。

然后我尝试添加一个可以处理两者的重载。

public static T GetValue<T>(int input) where T : struct { ... }
public static T GetValue<T>(int input) where T : class { ... }

但我发现你不能根据约束重载。

我意识到我可以有两个不同名称的方法,一个用于可空类型,一个用于不可用类型,但我宁愿不这样做。

有没有一种好方法可以检查我是否可以在不使用T的情况下投放到as?或者我可以使用as并使用一种适用于所有类型的方法吗?

1 个答案:

答案 0 :(得分:7)

您可以使用is

return value is T ? (T)value : default(T);

(请注意,如果value is T为空,false将返回value。)