2017-06-02 21 views
0

私は次の関数の仕事をしたいと思い:もちろんdatarowフィールドをジェネリック型にキャストする方法はありますか?

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

関連する問題