Ich habe eine Methode, die einen Parameter obj vom Typ System.Objectbeste Art und Weise zu testen, ob ein Typ eine Sammlung ist
Jetzt möchte ich überprüfen, ob der tatsächliche Typ von obj akzeptiert:
- Ein Sammlungstyp (IEnumerable).
- Sonst noch etwas.
Der erste Weg, dachte ich an ist:
if (obj is IEnumerable)
// obj is a collection
Aber System.String implementiert IEnumerable, und Ich will nicht Zeichenfolge als eine Sammlung behandeln.
Die zweite Möglichkeit, die ich dachte, testet für ICollection statt IEnumerable, da IEnumerable eher eine potenzielle Sammlung als eine tatsächliche ist. Dies würde String auslassen, aber auch ICollection-Of-T, weil ICollection nicht erbt (IEnumerable-Of-T ist die einzige generische Auflistungsabstraktion, die abwärtskompatibel ist - sie erbt IEnumerable).
Also ich denke, der beste Weg ist:
if (obj is string)
// not a collection
else if (obj is IEnumerable)
// collection
else
// not a collection
Gibt es einen besseren Weg?
Ich sehe enumerables als Abfolgen, nicht als Sammlungen. Es gibt möglicherweise einen subtilen Unterschied in der Bedeutung dort; Da ich Ihre Bewerbung nicht kenne, weiß ich nicht, ob das relavent ist. Wir haben dieses Problem beim Entwerfen von Sammlungsinitialisierern angegangen. Es gibt viele "Collections", die ICollection nicht implementieren, und es gibt viele Objekte, die Add implementieren, die keine Collections sind. (Typischerweise Math-Objekte.) Wir entschieden uns für eine Heuristik. Wenn ein Typ sowohl IEnumerable als auch eine öffentliche Add-Methode implementiert, handelt es sich wahrscheinlich um eine Auflistung. Das ist ein bisschen doof, aber in der Praxis funktioniert es. –
Dies ist eine gute verwandte Ressource über Sammlung Abstraktionen: http://blogs.msdn.com/brada/archive/2005/01/18/355755.aspx –