2012-08-06 30 views
4

我使用此擴展方法來轉換項目中的對象。但它無法轉換爲GUID,因爲它沒有實現IConvertible接口,但對於轉換,我總是不得不使用new Guid(fooobject),但我希望我可以使用此方法將對象轉換爲GUID。任何想法如何使我們能夠靈活使用GUID也。擴展方法:如何使它與GUID一起工作

擴展方法是

public static T ToType<T>(this object val, T alt) where T : struct, IConvertible 
    { 
     try 
     { 
      return (T)Convert.ChangeType(val, typeof(T)); 
     } 
     catch 
     { 
      return alt; 
     } 
    } 
+0

雖然GUID確實有[自己的TypeConverter](http://msdn.microsoft.com/en-us/library/system.componentmodel.guidconverter),您可以隨時進行特殊情況檢查'typeof(T)''。 ASPX)。您可能需要將'val'轉換爲'string'。否則,請參閱頁面上的示例。 – 2012-08-06 07:03:13

+0

是'TypeConverter'不存在GUID,因爲它是我猜的值類型。我們需要明確地取消裝箱,將其轉換爲GUID。這就是爲什麼我想要使用擴展方法做到這一點... – 2012-08-06 07:06:34

+0

我很確定它仍然會工作..如果'val'是*不* GUID值,那麼你需要轉換它。如果它是一個GUID,你可以用'typeof(T)'檢查來判斷,並直接進行轉換。 – 2012-08-06 07:07:49

回答

2

因爲你有該類型要轉換爲實現IConvertible interface(而Guid structure)不,你沒有選擇創建一個過載,這樣的約束:

public static Guid ToType(this object val, Guid alt) 
{ 
    try 
    { 
     // Convert here. 
    } 
    catch 
    { 
     return alt; 
    } 
} 

當你傳遞一個Guid,這將解決因section 7.4.2 of the C# specification(重點煤礦):

一旦候選函數成員和參數列表已經 確定,最好的函數成員的選擇在 情況都一樣:

  • 給定了適用的候選函數成員的,最好的該組中的函數成員位於。

鑑於Guid比類型參數T更具體的比賽,你的第二個方法將被調用。

注意,如果你刪除IConvertible接口約束,你可以在一個單一的方法處理這個問題,但你必須要能夠有邏輯來處理傳遞了T(一TypeConverter實例任何結構將在這裏很方便)。

相關問題