2010-01-12 59 views
22

我正在腦中死亡;我有幾個List'的定義,基於特定的類(c1,c2,c3 ...)。我有一個方法可以處理這些列表上的信息。我想要做的是傳入特定列表,但讓方法接受通用列表,然後通過typeof確定要執行的具體工作。我知道它是可能的,但我似乎無法得到在方法方面的語法。因此,例如:在C#中傳遞一個泛型List <>#

List<c1> c1var; 
List<c2> c2var; 
List<c3> c3var; 

some_method(c1var); 
some_method(c2var); 
some_method(c3var); 

class some_thing 
some_method(List<> somevar) 
if typeof(somevar).name = x then 
esle if typeof(somevar).name = y then.... 

如何設置該方法的參數列表?

在此先感謝 R.桑德斯

+2

快速的問題,爲什麼你不會重載some_method接受特定類型的列表,而不是做typeof? – 2010-01-12 17:53:39

回答

40

您需要聲明some_method是通用的,也是如此。

void SomeMethod<T>(List<T> someList) 
{ 
    if (typeof(T) == typeof(c1)) 
    { 
     // etc 
    } 
} 
+0

謝謝......正是我所需要的 – RockySanders99 2010-01-12 17:59:18

+12

小心使用typeof。這將檢查類型是否完全相同,而不考慮類型層次結構。因此,像MemoryStream和Stream之類的東西不會計算爲相同類型(typeof(MemoryStream)== typeof(Stream)的計算結果爲false)。這可能是需要的,但應該注意。使用'is'關鍵字是評估類型的典型方法,因爲「MemoryStream is Stream」將評估爲true,因爲它們共享相同的對象層次結構。 – 2010-01-12 18:11:52

0
在參數部分放列表

然後嘗試在代碼 switch(typeof(T){case typeof(int): break;})

7

小心使用typeof運算(TYP1)的== typeof運算(TYP2)。這將測試以查看類型是否相同,而不考慮類型層次結構。

例如:

typeof(MemoryStream) == typeof(Stream); // evaluates to false 
new MemoryStream() is Stream; //evalutes to true 

一種更好的方式進行檢查,看是否有物體的類型是使用「是」的關鍵字。一個例子如下:

public static void RunSnippet() 
{ 
    List<c1> m1 = new List<c1>(); 
    List<c2> m2 = new List<c2>(); 
    List<c3> m3 = new List<c3>(); 

    MyMeth(m1); 
    MyMeth(m2); 
    MyMeth(m3); 
} 

public static void MyMeth<T>(List<T> a) 
{ 
    if (a is List<c1>) 
    { 
     WL("c1"); 
    } 
    else if (a is List<c2>) 
    { 
     WL("c2"); 
    } 
    else if (a is List<c3>) 
    { 
     WL("c3"); 
    } 
}