2017-06-02 92 views
0

我想作以下功能工作:如何將數據行字段轉換爲泛型類型?

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

回答

1

你唯一的選擇是return default(T);

+0

這似乎是一個不錯的選擇:) – Jean

0

我發現了一個類似的問題,用什麼似乎是這裏良好的反應:

Nullable type as a generic parameter possible?

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

作爲簽名可以工作。

+0

問題是,如果該類型不是Nullable,我猜可能需要在強制轉換或調用.Value之後進行強制轉換。 – Jean