So erhalten Sie einen Basistyp eines IEnumerable [Duplikat]

8

Ich habe einen Eigenschaftstyp von IEnumerable

public IEnumerable PossibleValues { get; set; }

Wie kann ich den Basistyp herausfinden, für den er instanziiert wurde?

Zum Beispiel, wenn es so erstellt wurde:

%Vor%

Ich möchte wissen, dass dieser Typ 'int' ist.

    
Raoni Zacaron 04.10.2012, 13:29
quelle

3 Antworten

3

Sie können dies tun, wenn Sie den Typ von PossibleValues ​​möchten:

%Vor%

Oder Sie können dies tun, wenn Sie den Typ eines in PossibleValues ​​enthaltenen Elements wünschen (vorausgesetzt, das Array hat tatsächlich die in Ihrer Frage beschriebenen Werte):

%Vor%


BEARBEITEN

Wenn es möglich ist, dass das Array keine Elemente enthält, müssen Sie natürlich eine Null-Überprüfung durchführen:

%Vor%     
bugged87 04.10.2012, 13:33
quelle
8
%Vor%

Dieses Beispiel hat einige Einschränkungen, die Sie in Ihrer Anwendung betreffen können oder nicht. Es behandelt nicht den Fall, in dem der Typ IEnumerable , aber nicht IEnumerable<T> implementiert. Wenn der Typ IEnumerable<T> mehr als einmal implementiert, wählt er eine Implementierung willkürlich aus.

    
phoog 04.10.2012 13:39
quelle
2

Zwei bestehende Ansätze sollen sehen, ob das Objekt IEnumerable<T> implementiert oder den Typ des ersten Elements in der Menge überprüft. Der erste basiert auf dem Objekt, das tatsächlich IEnumerable<T> implementiert, und der zweite funktioniert nur, wenn alle Elemente in der Sequenz vom gleichen abgeleiteten Typ sind.

Eine interessante Frage, die Sie vielleicht stellen könnten, ist, welche Typen alle Elemente gemeinsam haben oder was der engste Typ ist, der unter allen Elementen gemeinsam ist.

Wir beginnen mit einer einfachen Hilfsmethode. Bei einem gegebenen Typ wird eine Sequenz dieses Typs und aller Basistypen zurückgegeben.

%Vor%

Als nächstes haben wir eine Methode, um alle gebräuchlichen Typen für eine Sequenz zu erhalten, indem wir zuerst alle abgeleiteten Typen finden, dann alle Basistypen für jeden Typ in der Sequenz holen und schließlich intersect verwenden. um nur die Dinge zu bekommen, die sie alle gemeinsam haben:

%Vor%

Beachten Sie, dass die Reihenfolge der Typen in der ersten Methode von den meisten abgeleiteten zu den am wenigsten abgeleiteten ist und Intersect die Reihenfolge beibehält, so dass die resultierende Folge in der Reihenfolge von den meisten abgeleiteten zu den am wenigsten abgeleiteten ist. Wenn Sie den engsten Typ für alle diese Typen finden möchten, können Sie einfach First für das Ergebnis dieser Methode verwenden. (Beachten Sie, dass, da alles von object abstammt, immer mindestens ein Typ zurückgegeben wird, es sei denn, es gibt keine Elemente in der ursprünglichen IEnumerable .

    
Servy 04.10.2012 14:19
quelle

Tags und Links