2016-07-22 66 views
0

我試圖將通用方法參數轉換爲其類型。編譯器說我不能轉換它將通用T轉換爲C#

public ProvideRequest ProvideRequest<T>(int numberOfLines, 
             string ServiceType, 
             T addressIdentifier) 
{ 
    var provideRequest = new ProvideRequest(); 
    provideRequest.NumberOfLines = numberOfLines; 
    provideRequest.ServiceType = ServiceType; 

    Type t = typeof(T); 
    switch (t.GetType().Name) 
    { 
     case nameof(GoldAddressKeyIdentifierType): 
      provideRequest.RequestIdentifier = 
       Convert.ChangeType(addressIdentifier, typeof(GoldAddressKeyIdentifierType)) 
      break; 
    } 

    return provideRequest; 
} 

任何幫助,這將不勝感激。

+0

它是一個錯字't.GetType()。Name'?它應該只是't.Name' –

+5

泛型類型隨後測試其類型參數的具體類型並使用一系列以類型***爲前提的條件來修改它們的行爲不應該是通用的***。除少數情況外,這是一種濫用行爲。 – spender

+2

簡單地通過使用'publicRequestRequestRequestRequest (int numberOfLines,stringServiceType,GoldAddressKeyIdentifierType addressIdentifier)'來處理特定於類型的操作並放棄轉換想法,您的代碼將得到顯着改進。您最終會得到更強大的類型檢查和更易於調試的代碼。 – spender

回答

2

問題是,當調用t.GetType()時,您不會得到通用類型,而只是System.Type,它是t的運行時類型。你想,而不是什麼是泛型類型,您可以通過獲得的名稱:

switch(typeof(T).Name) 

此外Name返回一個字符串,所以你必須寫cases如下:

case MyNamepscae.GoldAddressKeyIdentifierType: 

不過我強烈建議不要依賴typenames,只需切換實際類型本身。然而,switch聲明只允許字符串,所以使用if代替:

if(typeof(T) == typeof(GoldAddressKeyIdentifierType)) 
1

我建議比較兩個Types

... 

    if (typeof(T) == typeof(GoldAddressKeyIdentifierType)) 
    provideRequest.RequestIdentifier = 
       Convert.ChangeType(addressIdentifier, typeof(GoldAddressKeyIdentifierType)); 

    return provideRequest; 

然而,泛型<T>)應該工作的泛型類型,任何特殊的條件是不好的情況

+0

的方法,謝謝我仍然遇到了與此 – chrisblue13

+0

根據https://msdn.microsoft.com/en-us/library/dtb69x08 convert.chaneType錯誤( v = vs.110).aspx'GoldAddressKeyIdentifierType'應該實現'IConvertible'。是這樣嗎?那麼錯誤是什麼? –

1
Type t = typeof(T); // type of T 
    switch (t.GetType().Name) 

這個開關可能是個錯誤。 t是Type類型。所以t.GetType()是System.RuntimeType,所以t.GetType()。Name總是你知道的「System.RuntimeType」。

據我理解你的問題,你需要刪除.GetType(),您需要

switch(t.Name) 
1

既然你知道它是類型GoldAddressKeyIdentifierType的,你應該能夠把對象作爲類在你的情況下方法

provideRequest.RequestIdentifier = (GoldAddressKeyIdentifierType)addressIdentifier; 
+0

謝謝。我也這麼想,但它不喜歡它 – chrisblue13