2010-01-12 22 views
22

Wyrzucam na to mózg; Mam kilka zdefiniowanych list, w oparciu o określone klasy (c1, c2, c3 ...). Mam metodę, która przetwarza informacje na tych listach. Co chcę zrobić, to przekazać na konkretnej liście, ale niech metoda zaakceptuje ogólną listę, a następnie za pomocą typeof określić, co konkretnej pracy do zrobienia. Wiem, że jest to możliwe, ale wydaje mi się, że nie udało mi się uzyskać właściwej składni po stronie metody. więc na przykład:Przekazywanie ogólnej listy <> w języku C#

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.... 

Jak ustawić listę parametrów dla metody?

z góry dzięki R. Sanders

+2

Szybkie pytanie, dlaczego nie należy przeciążać some_method, aby akceptować określone typy list, zamiast wykonywać typof? –

Odpowiedz

40

Musisz zadeklarować some_method być ogólne, jak również.

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

dzięki ... właśnie to, czego potrzebowałem. – RockySanders99

+12

Ostrożnie, używając tego typu. Sprawdzi to, czy typy są dokładnie takie same bez poszanowania hierarchii typów. W rezultacie coś takiego jak MemoryStream i Stream nie będzie oceniać do tego samego typu (typeof (MemoryStream) == typeof (Stream) ocenia jako false). To może być pożądane, ale warto o tym wiedzieć. Używanie słowa kluczowego "jest" jest typową metodą oceny typów, ponieważ "MemoryStream to Stream" zostanie uznane za prawdziwe, ponieważ mają one tę samą hierarchię obiektów. –

0

w sekcji Lista parametrów put a następnie spróbuj w kodzie switch(typeof(T){case typeof(int): break;})

7

Ostrożnie z wykorzystaniem typeof (Typ1) == typeof (Typ2). To sprawdzi, czy typy są równoważne, nie biorąc pod uwagę hierarchii typów.

Na przykład:

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

Lepszy sposób sprawdzić, jeśli obiekt jest typu jest użycie „jest” słowo kluczowe. Przykład znajduje się poniżej:

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"); 
    } 
} 
Powiązane problemy