2008-10-24 11 views
13

Wie bekomme ich den Typ einer generischen typisierten Klasse innerhalb der Klasse?.NET: Wie überprüft man den Typ innerhalb einer generischen typisierten Klasse?

Ein Beispiel:

Ich baue eine generische typisierte Sammlung ICollection < T> implementieren. Innerhalb ich habe Methoden wie

public void Add(T item){ 
     ... 
    } 

    public void Add(IEnumerable<T> enumItems){ 
     ... 
    } 

Wie kann ich für den gegebenen Typ innerhalb der Methode fragen T?

Der Grund für meine Frage ist: Wenn Objekt verwendet wird, wie T die Sammlung hinzufügen verwendet (Objektpunkt) anstelle von Add (IEnumerable < object> enumItems), auch wenn der Parameter IEnumerable ist. Im ersten Fall würde also die gesamte aufzählbare Sammlung als ein Objekt anstelle mehrerer Objekte der aufzählbaren Sammlung hinzugefügt.

Also brauche ich so etwas wie

if (T is object) { 
    // Check for IEnumerable 
} 

aber das ist natürlich in C# nicht funktionieren kann. Vorschläge?

Vielen Dank!

Michael

Antwort

21

Persönlich würde ich durch Umbenennen der IEnumerable<T> Methode AddRange das Problem Schritt Seite. Dies vermeidet solche Probleme und ist konsistent mit existierenden APIs wie List<T>.AddRange.

Es hält auch Dinge sauber, wenn die T Sie hinzufügen möchten IEnumerable<T> (selten, ich gebe es zu).

29

können Sie verwenden: typeof(T)

if (typeof(T) == typeof(object)) { 
    // Check for IEnumerable 
} 
+2

Dies beantwortet die Frage im Titel gefragt. – reads0520

-1

Wenn Sie den is Operator in einer generischen Klasse/Methode, die Sie T auf einen Referenztyp beschränken, müssen verwenden möchten:

public void MyMethod<T>(T theItem) where T : class 
{ 
    if (theItem is IEnumerable) { DoStuff(); } 
} 
+0

Ich denke, er ist nur besorgt, wenn eine nicht-generische IEnumerable als System.Object übergeben wird, wenn T ist System.Object –

+0

marxidad, ja, das stimmt. – Mil

Verwandte Themen