如何将datarow字段转换为泛型类型?

时间:2017-06-02 18:43:23

标签: c# database casting ado.net

我想让以下功能起作用:

    T GetRowVal<T>(System.Data.DataRow dr, string fieldName)
    {
        var type=typeof(T);
        var val = dr[fieldName];
        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
            if (val == DBNull.Value || val == null) return null;
        return (T)val;
    }

当然,没有对T类型的约束,即使在这种情况下应该允许它也不想返回null。 我该如何纠正这个功能? (或者,如果有更好的方法,请告诉我。)

知道,我会采用的方法:

    T GetRowVal<T>(System.Data.DataRow dr, string fieldName)
    {
        var type=typeof(T);
        var val = dr[fieldName];
        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
            if (val == DBNull.Value || val == null) return default(T);
        return (T)val;
    }

新解决方案:)

return dr.Field<T>(fieldName);

不确定它在性能方面是否更好,但可能看起来更干净。

可以在MS Github上找到实现:

https://github.com/Microsoft/referencesource/blob/master/System.Data.DataSetExtensions/System/Data/DataRowExtensions.cs

2 个答案:

答案 0 :(得分:1)

您唯一的选择是return default(T);

答案 1 :(得分:0)

我在这里找到了一个类似的问题,似乎是一个很好的回答:

Nullable type as a generic parameter possible?

Nullable<T> GetRowVal<T>(System.Data.DataRow dr, string fieldName)

因为签名可以起作用。