2012-03-01 31 views
5

我想寫一個方法將給定的對象轉換爲給定類型的實例。我開始與此:C#幫我一些泛型鑄造迷人

private static T TryCast<T>(object o) 
{ 
    return (T) o; 
} 

進去,我知道那不會工作,但它說明了這一概念。現在,當我有不會自動投射的類型時,我會開始遇到問題,如字符串 - > DateTime。我試圖使用Convert類來處理這些情況,但我只是得到一個編譯時錯誤而不是運行時錯誤。以下代碼獲取編譯錯誤「無法投型‘字符串’的表達式類型‘T’

private static T TryCast<T>(object o) 
{ 
    var typeName = typeof (T).FullName; 

    switch (typeName) 
    { 
     case "System.String": 
      return (T) Convert.ToString(o); 
     default: 
      return (T) o; 
    } 
} 

我也知道Convert.ChangeType()的,但我不知道它是否會在處理邊緣我會以其他方式處理在上述開關,就像規定字符串的情況下 - >日期時間,我會通常只使用Convert.ToDateTime爲

private static T TryCast<T>(object o) 
{ 
    return (T)Convert.ChangeType(o, typeof(T)); 
} 

那麼,什麼是我最好的選擇。如果有人可以給?我一個可行的方法,我可以從那裏拿。

+0

好的,爲了給出一個上下文,此方法的直接用法是從DataRow對象的列值中動態分配類型爲T的實例的屬性。我會傳入Dictionary 其中Key =實例上的屬性名稱,以及Value = DatRow上的列名稱。我已經寫了反射來從類型中獲取PropertyInfos並設置實例值。這個鑄造位是我最後一塊拼圖。我希望它儘可能重複使用,但是如果將範圍限制在我的示例中使其更容易,那就這樣做吧。 – 2012-03-01 16:15:17

+0

我知道上面的第二個例子應該生成編譯器錯誤,以及爲什麼。我只是用它來說明方法,謝謝。不是新的:<) – 2012-03-01 16:26:09

回答

6

Convert.ChangeType應該處理邊緣情況;它代表IConvertible

要回答這個問題,編譯器不知道Tstring
因此,它不會讓你在不相關的類型之間進行投射(就像你無法投射ButtonTextBox)。

可以解決,通過鑄造object第一:

return (T)(object)o.ToString(); 

現在,每個單獨的轉換是由編譯器(它要麼直接向上轉型或直接沮喪的)允許,你知道,整個事情將起作用,因爲TString

+0

爲什麼赫克沒有想到這個?讓我們看看其他人都說了些什麼,但這可能是被接受的答案。 – 2012-03-01 16:20:56