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.
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% 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.
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:
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
.
Tags und Links c# ienumerable