我正在試驗流利的擴展方法。使用通用約束與值類型
我有以下簡單的擴展方法來執行安全的強制轉換。
public static T As<T>(this Object source)
where T : class
{
return source as T;
}
這個效果不錯,但是當我試圖使它直觀的使用值類型與過載
public static T As<T>(this ValueType source)
where T : struct
{
return (T)source;
}
我遇到了問題。方法解析邏輯總是選擇上面的第一個方法,並給出了一個語法錯誤(準確地說)該結構不是一個類。
有沒有辦法處理上述問題,還是應該在去測試和處理同一方法中的所有類型時去除約束的路線?
====編輯:回答問題====
我編寫本針對3.5框架。我並不是真的想要完成任何事情;這只是上述的一個實驗。我的興趣很激烈,我把一些代碼扔在一起。
我不是特別在意它仍然是一個'安全'的角色。這就是它如何開始的,並且可以通過default()保持安全 - 但這並不是問題和代碼確保「安全」只會模糊的焦點。
至於表現力,沒有value.As<int>()
沒有比(int)value
更有表現力;但爲什麼該方法的用戶只能「知道」它只能用於引用類型呢?我努力工作的內容更多的是關於該方法的預期行爲,而不是表達性寫作。
代碼段value.As<DateTime>()
給出了錯誤「類型'System.DateTime'必須是引用類型才能在通用類型或方法中用作參數'T'.... As(object)」 。從錯誤消息我看到它是解決使用上面的方法,因爲它是需要引用類型。
什麼的C#版本使用你正在用嗎?在.NET 4中,選擇了第二個重載。 –
你的意思是像'object o = 42; var i = o.As();'給出語法錯誤?或者你能顯示給出它的確切代碼嗎? –
svick
@ svick的評論讓我想起了你可能試圖用數據庫結果做的事情,比如DataRow。如果是這樣,則已經有一個擴展方法來將行中的對象值轉換爲適當的類型。 [.Field](http://msdn.microsoft.com/en-us/library/bb360891.aspx) –