2014-04-21 89 views
0

我有一個複雜的問題需要解決。沒有泛型比較

我有一個對象列表,雖然後來列表將填充兩種不同類型的實例。

第一類是MyFirstType<T1, T2>和第二類是MySecondType<T>

現在我需要,雖然對象列表中運行,並詢問這兩個一個是每個項目。然後我需要在物品上做一些自定義邏輯。

例如:

foreach(object obj in list) 
{ 
    if(obj is MyFirstType<T1, T2>) 
    { 
    // do something 
    } 
    else if(obj is MySecondType<...>) 
    { 
    } 
} 

的問題是T或T1和T2可以是任何類型的讓我怎麼寫出這樣的如果 - 是關鍵字語句如果MyFirstType但不仿製藥裏面,只有comparies? if(obj is MyFirstType<T1, T2>)不起作用,因爲它需要T1和T2的具體類型。

像剛纔提到的那樣,只需要比較沒有T1和T2。任何想法如何解決這個問題?

+0

http://stackoverflow.com/q/457676 –

+2

這類型檢查幾乎總是採取錯誤方法解決問題的產物;你能否抽象一點,詳細說明實際的任務是什麼以及你如何解決它? –

+0

@AntP謝謝,但不是謝謝問題是我不應該改變我的設計或不。很明顯,問題是什麼。如果你不能解決這個問題,請不要開始討論如何/應該如何做對。 –

回答

2

您可以使用屬性類的TypeIsGenericType檢查obj.GetType()是通用的,然後用GetGenericTypeDefinition獲得泛型類型定義,它可以比作typeof(MyFirstType<,>)typeof(MySecondType<>)

foreach(object obj in list) 
{ 
    if(obj.GetType().IsGenericType) 
    { 
     if(obj.GetType().GetGenericTypeDefinition() == typeof(MyFirstType<,>)) 
     { 
      // do something 
     } 
     else if(obj.GetGenericTypeDefinition() == typeof(MySecondType<>)) 
     { 
     } 
    } 
} 
2
  1. 便宜的解決方案:創建一個你在類型中得到的標誌接口。這只是幫助確定類型。
  2. 使用反射並檢查類型定義並檢查類型的名稱。
2

爲什麼不使用多態性?這兩種類型使用通用方法實現接口。然後在每種類型的實現中爲你需要的方法編寫代碼。

public interface ICommon 
{ 
    void DoThis(); 
} 

對於MyFirstType和MySecondType你將有:

public class MyFirstType<T> : ICommon 
{ 
    public void DoThis() 
    { 
     //DoThis 
    } 
} 

public class MySecondType<T1,T2> : ICommon 
{ 
    public void DoThis() 
    { 
     //DoThis 
    } 
} 

然後,你可以寫下面的foreach循環:

foreach(object obj in list) 
{ 
    obj.DoThis(); 
} 
+1

+1以獲得很好的答案,雖然可能是浪費的注意力。 –

+0

我無法更改類型。他們是第三方。他們被密封。無論如何謝謝本。我很欣賞你的建議。 @AntP這不是一個腰桿,但是你的評論已經被拒絕了。你不是說你繼續前進嗎? –