J'essayais de faire des tests de convention aujourd'hui, et d'obtenir tous les types dans un assembly (en appelant Assembly.GetTypes()
), quand je suis tombé sur quelque chose:
System.RuntimeType:[First.Namespace.FirstClass]
Chaque fois que j'essaie de comparer ce type avec typeof(FirstClass)
, ils ne sont pas égaux. Donc, quand j'essaye de trouver tous les types qui contiennent FirstClass
comme paramètre générique, je n'en trouve aucun.
Quelle est la différence entre System.RuntimeType
et System.Type
?
Existe-t-il un moyen de résoudre mon problème?
c#
reflection
Edgar Gonzalez
la source
la source
Réponses:
System.RuntimeType
est une classe concrète qui dérive de la classe de base abstraiteSystem.Type
. Puisqu'ilSystem.RuntimeType
n'est pas public, vous en rencontrerez généralement des instances commeSystem.Type
.Une confusion peut survenir lorsque vous essayez d'obtenir le type d'un objet et que vous appelez par erreur
GetType()
un autre objet représentant le type du premier objet, plutôt que de simplement utiliser cet objet directement. PuisType.ToString()
retournera"System.RuntimeType"
lorsque l'objet sur lequel il est appelé représente un Type:string str = string.Empty; Type strType = str.GetType(); Type strTypeType = strType.GetType(); strType.ToString(); // returns "System.string" strTypeType.ToString(); // returns "System.RuntimeType"
Par exemple, dans ce billet de blog, quelqu'un essaie d'obtenir le type d'une colonne dans une base de données, en faisant quelque chose comme ceci:
object val = reader.GetFieldType(index); Type runtimeType = val.GetType(); PropertyInfo propInfo = runtimeType.GetProperty("UnderlyingSystemType"); Type type = (Type)propInfo.GetValue(val, null);
Puisque val est déjà un objet Type, val.GetType () retournera un autre objet Type représentant le type
System.RuntimeTime
car il s'agit du type concret utilisé pour représenter l'objet type d'origine. Le billet de blog montre ensuite une supercherie de réflexion inutile, pour obtenir le type de l'objet de type d'origine, alors qu'en réalité, tout ce qui était nécessaire était:Type type = reader.GetFieldType(index) as Type;
Donc, si votre
Type
objet signale qu'il représente aSystem.RuntimeType
, assurez-vous que vous n'avez pas accidentellement appeléGetType()
un type que vous avez déjà.la source
Type
—il retournera vrai même si vous réussisseztypeof(int)
. Le deuxième extrait de code ne fonctionne pas pour comparertypeof(string).GetType()
ettypeof(Type)
.De la réponse à Différent entre System.Type et System.RuntimeType par Thomas Danecker :
la source
En bref...
"".GetType().ToString() == "System.String" "".GetType().GetType().ToString() == "System.RuntimeType"
La façon dont je pense maintenant est qu'il
System.Type
s'agit d'un type de base pour le type qui représente les résultats de la demande de type d'objet au moment de l'exécution, à savoirSystem.RuntimeType
. Ainsi, lorsque vous demandez le type d'un objet, comme dans"".GetType()
, l'instance deSystem.Type
retour est descendant de lui,System.RuntimeType
. En fait, il faut s'attendre à ce que letypeof(System.Type).GetType()
soitSystem.RuntimeType
aussi, mais je pense que le cadre empêche spécifiquement cette ... symétrie.la source
Jetez un œil à ce blog, le gars parle de la différence. Il me semble que ces classes sont le résultat de l'optimisation .NET:
http://blogs.msdn.com/b/vancem/archive/2006/10/01/779503.aspx
la source