不幸的是,你不會是能夠通過使用泛型以獲取引用類型的可空返回類型和支持,除非你指定你想,當你撥打電話可空返回
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");
我沒有測試這個,只是把它扔在這裏。試一試。
編輯:
或者,如果你真的想要的值類型轉換成nullables,仍然能夠支持引用類型這樣的事情可能會奏效
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");
然而,這不會像接受泛型類型參數中的可空類型那樣有效秒。
你有約束T結構的目的嗎? – 2011-02-09 16:47:39
問題是用T?,你不能有String?鍵入 – 2011-02-09 16:50:25
是的原因,如果沒有這個約束,你有一個編譯錯誤,因爲你不能返回一個可爲空的類型(T?)。我知道這是問題,我不能使用字符串,因爲它不是一個結構。但是如果有人有想法? – 2011-02-09 16:52:14