如何解决这个问题,以便将通用转换为Nullable <T>?

The*_*edi 46 c# nullable

我目前使用这个方便的转换扩展方法来进行类型之间的转换:

    public static T To<T>(this IConvertible obj)
    {
        return (T)Convert.ChangeType(obj, typeof(T));
    }
Run Code Online (Sandbox Code Playgroud)

但是,它不喜欢将有效值转换为Nullable,例如,这会失败:

    "1".To<int?>();
Run Code Online (Sandbox Code Playgroud)

显然,1很容易转换为(int?),但它得到错误:

    Invalid cast from 'System.String' to 'System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.
Run Code Online (Sandbox Code Playgroud)

这是一个明显简化的例子,实际上我用它来做字符串类型的转换,如下所示:

packageDb.Quantity = package.package.ElementDeep(Namespace + "PackageQuantity", Namespace + "ActualQuantity", Namespace + "Quantity").ValueOrNull().To<int?>();
Run Code Online (Sandbox Code Playgroud)

如果Convert.ChangeType不喜欢Nullable,那么任何人都有什么好主意吗?

Luk*_*keH 96

public static T To<T>(this IConvertible obj)
{
    Type t = typeof(T);
    Type u = Nullable.GetUnderlyingType(t);

    if (u != null)
    {
        return (obj == null) ? default(T) : (T)Convert.ChangeType(obj, u);
    }
    else
    {
        return (T)Convert.ChangeType(obj, t);
    }
}
Run Code Online (Sandbox Code Playgroud)


Hen*_*que 5

public static T To<T>(this IConvertible obj) 
{
    Type t = typeof(T);
    if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>))
        t = t.GetGenericArguments()[0];

    return (T)Convert.ChangeType(obj, t); 
}
Run Code Online (Sandbox Code Playgroud)

但如果转换失败,它将抛出异常,而不是按预期返回 null。