Ich habe heute versucht, einige Konventionstests durchzuführen und alle Typen in einer Assembly zu erhalten (durch Aufrufen Assembly.GetTypes()
), als ich auf etwas gestoßen bin:
System.RuntimeType:[First.Namespace.FirstClass]
Wann immer ich versuche, diesen Typ mit zu vergleichen, typeof(FirstClass)
sind sie nicht gleich. Wenn ich also versuche, alle Typen zu finden, die FirstClass
einen generischen Parameter enthalten, finde ich keine.
Was ist der Unterschied zwischen System.RuntimeType
und System.Type
?
Gibt es eine Möglichkeit, mein Problem zu lösen?
c#
reflection
Edgar Gonzalez
quelle
quelle
Antworten:
System.RuntimeType
ist eine konkrete Klasse, die sich von der abstrakten Basisklasse ableitetSystem.Type
. DaSystem.RuntimeType
es nicht öffentlich ist, werden Sie normalerweise auf Instanzen davon als stoßenSystem.Type
.Verwirrung kann entstehen, wenn Sie versuchen, den Typ eines Objekts zu ermitteln und fälschlicherweise
GetType()
ein anderes Objekt aufrufen, das den Typ des ersten Objekts darstellt, anstatt nur dieses Objekt direkt zu verwenden. DannType.ToString()
kehrt ,"System.RuntimeType"
wenn das Objekt , um es aufgerufen wird auf ist die eine Art:In diesem Blog-Beitrag versucht beispielsweise jemand, den Typ einer Spalte in einer Datenbank abzurufen. Dabei wird Folgendes ausgeführt:
Da val bereits ein Typobjekt ist, gibt val.GetType () ein anderes Typobjekt zurück, das den Typ darstellt,
System.RuntimeTime
da dies der konkrete Typ ist, der zur Darstellung des ursprünglichen Typobjekts verwendet wird . Der Blog-Beitrag zeigt dann einige unnötige Reflexionstricks, um den Typ des ursprünglichen Typobjekts zu ermitteln, wenn wirklich nur Folgendes erforderlich war:Wenn Ihr
Type
Objekt also meldet, dass es einen darstelltSystem.RuntimeType
, stellen Sie sicher, dass Sie nicht versehentlichGetType()
einen Typ aufgerufen haben, den Sie bereits haben.quelle
Type
true zurück, selbst wenn Sie übergebentypeof(int)
. Das zweite Code-Snippet funktioniert nicht zum Vergleichen vontypeof(string).GetType()
undtypeof(Type)
.Aus der Antwort auf Unterschied zwischen System.Type und System.RuntimeType von Thomas Danecker :
quelle
In Kürze...
Ich denke jetzt, dass dies
System.Type
ein Basistyp für den Typ ist, der die Ergebnisse der Objekttypanforderung zur Laufzeit darstellt, nämlichSystem.RuntimeType
. Wenn Sie also den Typ eines Objekts wie in anfordern,"".GetType()
ist die zurückgegebene InstanzSystem.Type
dessen NachkommenSystem.RuntimeType
. In der Tat sollte man erwarten, dass das auch sotypeof(System.Type).GetType()
sein sollteSystem.RuntimeType
, aber ich denke, das Framework verhindert speziell diese ... Symmetrie.quelle
Schauen Sie sich diesen Blog an, der Typ spricht über den Unterschied. Für mich sind diese Klassen das Ergebnis der .NET-Optimierung:
http://blogs.msdn.com/b/vancem/archive/2006/10/01/779503.aspx
quelle