Angenommen, ich habe ein generisches Mitglied in einer Klasse oder Methode, also:
public class Foo<T>
{
public List<T> Bar { get; set; }
public void Baz()
{
// get type of T
}
}
Wenn ich die Klasse instanziiere, T
wird das MyTypeObject1
, sodass die Klasse eine generische Listeneigenschaft hat : List<MyTypeObject1>
. Gleiches gilt für eine generische Methode in einer nicht generischen Klasse:
public class Foo
{
public void Bar<T>()
{
var baz = new List<T>();
// get type of T
}
}
Ich würde gerne wissen, welche Art von Objekten die Liste meiner Klasse enthält. Die aufgerufene Eigenschaft list Bar
oder die lokale Variable baz
enthält also welche Art von T
?
Ich kann nicht Bar[0].GetType()
, weil die Liste möglicherweise keine Elemente enthält. Wie kann ich es tun?
object
,IList
oder ähnlich - aber das könnte sehr wohl die richtige Antwort sein.typeof
ist. Wenn Sie die Art von T wissen möchten, verwenden Sie einfachtypeof(T)
:)typeof()
mit einem generischen Parameter verwenden. Haben Sie ein Beispiel, wo es nicht funktionieren würde? Oder verwechseln Sie Typparameter und Referenzen?(Anmerkung: Ich gehe davon aus, dass alles , was Sie wissen , ist ,
object
oderIList
oder ähnliches, und dass die Liste jede Art zur Laufzeit sein könnte)Wenn Sie wissen, dass es ein ist
List<T>
, dann:Eine andere Möglichkeit ist, sich den Indexer anzusehen:
Verwenden neuer TypeInfo:
quelle
Mit der folgenden Erweiterungsmethode können Sie ohne Reflexion davonkommen:
Oder allgemeiner:
Verwendungszweck:
quelle
T
zum Zeitpunkt der Kompilierung bereits kennen . In diesem Fall benötigen Sie überhaupt keinen Code.ItemType
Versuchen
quelle
GetGenericArguments
Methode gibt ein Array-Objekt zurückType
, von dem Sie dann die Position des benötigten generischen Typs analysieren müssen. WieType<TKey, TValue>
: müssten SieGetGenericArguments()[0]
bekommenTKey
Art undGetGenericArguments()[1]
bekommenTValue
TypDas ist Arbeit für mich. Wo myList eine unbekannte Art von Liste ist.
quelle
<T>
) erforderlich istList
ist bereits eine Implementierung vonIEnumerable
, daher scheint die Besetzung nichts hinzuzufügen. Aber danke, es ist eine gute Lösung.Wenn Sie nicht die gesamte Typvariable benötigen und nur den Typ überprüfen möchten, können Sie einfach eine temporäre Variable erstellen und den Operator is verwenden.
quelle
Sie können diese für den Rückgabetyp einer generischen Liste verwenden:
quelle
Bedenken Sie Folgendes: Ich verwende es, um 20 typisierte Listen auf dieselbe Weise zu exportieren:
quelle
new T();
würde einfach das Gleiche tun wie(T)Activator.CreateInstance(typeof(T));
. Es ist erforderlich, dass Siewhere T : new()
der Klassen- / Funktionsdefinition hinzufügen. Wenn Sie jedoch Objekte erstellen möchten , sollte dies trotzdem erfolgen.GetType
einenFirstOrDefault
Eintrag auf, der zu einer möglichen Nullreferenzausnahme führt. Wenn Sie sicher sind, dass mindestens ein Artikel zurückgegeben wird, verwenden Sie ihnFirst
stattdessen.Ich benutze diese Erweiterungsmethode, um etwas Ähnliches zu erreichen:
Sie verwenden es so:
Dies ist nicht ganz das, wonach Sie suchen, aber es ist hilfreich, um die beteiligten Techniken zu demonstrieren.
quelle
Die
GetGenericArgument()
Methode muss für den Basistyp Ihrer Instanz festgelegt werden (deren Klasse eine generische Klasse istmyClass<T>
). Andernfalls wird ein Typ [0] zurückgegeben.Beispiel:
quelle
Sie können den Typ "T" von jedem Sammlungstyp abrufen, der IEnumerable <T> wie folgt implementiert:
Beachten Sie, dass Sammlungstypen, die IEnumerable <T> zweimal implementieren, nicht unterstützt werden, z
Ich nehme an, Sie könnten eine Reihe von Typen zurückgeben, wenn Sie dies unterstützen müssten ...
Außerdem möchten Sie möglicherweise auch das Ergebnis pro Sammlungstyp zwischenspeichern, wenn Sie dies häufig tun (z. B. in einer Schleife).
quelle
quelle
Verwenden der Lösung von 3dGrabber:
quelle
Wenn Sie den zugrunde liegenden Typ einer Eigenschaft kennen möchten, versuchen Sie Folgendes:
quelle
So habe ich es gemacht
Dann nenne es so
ODER
quelle
Art:
quelle
SingleOrDefault()
Wirft auch,InvalidOperationException
wenn zwei oder mehr Elemente vorhanden sind.