如何将数据行字段转换为泛型类型?

问题描述:

我想作以下功能工作:如何将数据行字段转换为泛型类型?

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; 
    } 

当然,它并不想返回null即使它应该在这种情况下所允许的T类没有限制。 我该如何纠正这个功能? (或者如果有更好的方法来做到这一点,请让我知道)。


因为知道,这种方法我会用:

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

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

+0

这似乎是一个不错的选择:) – Jean

我发现了一个类似的问题,用什么似乎是这里良好的反应:

Nullable type as a generic parameter possible?

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

作为签名可以工作。

+0

问题是,如果该类型不是Nullable,我猜可能需要在强制转换或调用.Value之后进行强制转换。 – Jean