2012-04-15 6 views
0

Ich habe diesen Code, um "A" als gefiltertes Ergebnis zu erhalten.Parameter von OfType <????> bei Verwendung in einer Methode mit C#

public static void RunSnippet() 
{ 
    Base xbase = new Base(); 
    A a = new A(); 
    B b = new B(); 
    IEnumerable<Base> list = new List<Base>() { xbase, a, b }; 
    Base f = list.OfType<A>().FirstOrDefault(); 
    Console.WriteLine(f); 
} 

Ich brauche IEnumerable<Base> list = new List<Base>() {xbase, a, b}; von einer Funktion wie folgt zu verwenden:

public static Base Method(IEnumerable<Base> list, Base b (????)) // I'm not sure I need Base b parameter for this? 
{ 
    Base f = list.OfType<????>().FirstOrDefault(); 
    return f; 
} 

public static void RunSnippet() 
{ 
    Base xbase = new Base(); 
    A a = new A(); 
    B b = new B(); 
    IEnumerable<Base> list = new List<Base>() { xbase, a, b }; 
    //Base f = list.OfType<A>().FirstOrDefault(); 
    Base f = Method(list); 
    Console.WriteLine(f); 
} 

Welche Parameter verwende ich in '????' um das gleiche Ergebnis vom ursprünglichen Code zu erhalten?

+5

Sie können 'Methode (Liste) 'nicht aufrufen -' Liste' ist keine 'Base', es ist ein' IEnumerable '. Das ist das zweite Mal, dass Sie diesen Fehler gemacht haben - wie komfortabel sind Sie mit "IEnumerable "? Und soll 'Methode' * immer * einen' A'-Wert zurückgeben? Wenn ja, warum wird es erklärt, um "Base" zurückzugeben, und warum können Sie nicht einfach "A" anstelle von "????" verwenden? –

+0

@Jon: Der Parameter von Method() sollte 'IEnumerable Liste, Base b' sein. Für ???? muss ich den Typ A vom zweiten Parameter bekommen. Ich habe versucht mit (Base b) als Parameter und b.GetType() in , aber es funktioniert nicht als b.GetType() Rückgabetyp nicht Base. – prosseek

Antwort

4

Es scheint, als ob Sie nach einer generischen Art zu tun suchen, was in Method basierend auf verschiedenen Kindertypen von Base ist. Sie können das tun, mit:

public static Base Method<T>(IEnumerable<Base> b) where T: Base 
{ 
    Base f = list.OfType<T>().FirstOrDefault(); 
    return f; 
} 

Dies wird die erste Instanz von b zurück, die vom Typ ist T (die ein Kind von Base sein).

+1

Beachten Sie, dass, obwohl dies akzeptiert wurde, es nicht dem entspricht, was die Frage eigentlich verlangt - nämlich, den Typ von einem Parameterwert zu bekommen. Es ist eine etwas verwirrte Frage, zugegebenermaßen ... –

+1

Meine ursprüngliche Antwort war weit weniger _sure_ von dem, was sie verlangten, und anscheinend richtig so. Es war mein Versuch, etwas Nützliches zu tun. Hoffentlich hat es wirklich geholfen. :) –

+0

@ M.Babcock - Das ist genau das, was ich wollte. Vielen Dank. – prosseek

2

Wenn Sie auf einer Art abfragen möchten, können Sie so etwas wie dies versuchen:

public static Base Method(IEnumerable<Base> list, Type typeToFind) 
{ 
    Base f = (from l in list 
     where l.GetType()== typeToFind 
       select l).FirstOrDefault(); 
    return f; 
} 

Wenn es nicht das, was Sie suchen, bitte klären.

+0

@ M.Babcock: Meinst du OfType, oder typeof? –

+1

Ist das nicht schon 'OfType '? –

+0

@JonSkeet - Bearbeitet (oder eher zurückgeschickt, weil ich es nicht rechtzeitig erfasst habe). –