残念ながら、呼び出し時にNullableを返すように指定しない限り、ジェネリックを使用してNullable戻り型と参照型のサポートを取得することはできません。
public static T Get<T>(this DataRow row, string field)
{
if (row.IsNull(field))
return default(T);
else
return (T)row[field];
}
そしてあなたが電話するとき
var id = dr.Get<int?>("user_id");
私はこれをテストしませんでした、ただここにそれを投げました。試してみます。
編集:
あるいは、値型をnull可能に変換し、それでも参照型をサポートできるようにしたい場合は、このようなものが機能する可能性があります
public static object GetDr<T>(this DataRow row, string field)
{
// might want to throw some type checking to make
// sure row[field] is the same type as T
if (typeof(T).IsValueType)
{
Type nullableType = typeof(Nullable<>).MakeGenericType(typeof(T));
if (row.IsNull(field))
return Activator.CreateInstance(nullableType);
else
return Activator.CreateInstance(nullableType, new[] { row[field] });
}
else
{
return row[field];
}
}
ただし、使用するたびにキャストが必要になります
var id = dr.Get<string>("username") as string;
var id = (int?)dr.Get<int>("user_id");
ただし、これは、ジェネリック型パラメーターでnull許容型を受け入れるほど効率的ではありません。