2013-02-17 58 views
-2

我有一些字符串,我想轉換爲不同的類型 - 通常是枚舉。 類控股這是一個通用型所以即使我有類型保存我無法找到如何動態地轉換如何動態地將類型轉換爲泛型?

   if(type.IsEnum) 
        typedValue = Enum.Parse(type, value , true); 
       } 
       else 
       { 
        typedValue = Convert.ChangeType(value,type); 
       } 

       foreach (Delegate method in pair.Value) 
       { 

        method.DynamicInvoke(new[] { value, typedValue, time }); 
       }' 

一種方法,我需要改變輸入的值是不是類型的保存但作爲一種通用類型根據類型

+0

你舉個例子嗎?因爲正如問題所在,要弄清楚你想要什麼是非常困難的 – 2013-02-17 15:28:30

回答

0

你不能這樣做,因爲只有在編譯時知道類型時才使用泛型。在你的例子中,type變量表示一個運行時類型。

0

您可以通過typeof獲得泛型參數的Type

public T Convert<T>(T value) 
{ 
    Type type = typeof(T); 
    if(type.IsEnum) 
     return (T)Enum.Parse(type, value , true); 
    } else { 
     ... 
    } 
} 

你也可以用當然類的泛型參數來做到這一點。但無論如何,你需要在編譯時知道類型。類型安全基於編譯器檢查。如果您在編譯時不知道類型,除非您有一個更具體的類型,所有相關類型都有共同之處,否則您將需要返回objectdynamic


讓我們假設您能夠創建一個方法,該方法完全動態返回正確的類型。

var converted = Convert(type, value); 

// Are you allowed to do this? 
converted = 2 * converted; 

// or this? 
converted = converted + " hello"; 

// or even this? 
converted.SaveAs("C:\Data\Converted.txt"); 

由於主叫方不知道在編譯時的類型(甚至是設計時),他是不能夠使用這種類型的適當方式。這是一個合乎邏輯的限制,而不是語言的限制。即使使用動態語言或使用C-Sharp的dynamic類型,您也需要了解您在設計時使用的類型。