System.RuntimeType
est un béton de classe qui dérive de la classe de base abstraite System.Type
. Depuis System.RuntimeType
n'est pas public, vous rencontrez généralement les instances comme System.Type
.
La Confusion peut survenir lorsque vous essayez d'obtenir le type d'un objet et appellent à tort GetType()
sur un autre objet qui représente le premier type de l'objet, plutôt que de simplement en utilisant directement cet objet. Ensuite, Type.ToString()
sera de retour "System.RuntimeType"
lorsque l'objet auquel il est appelé à représenter 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 blog, quelqu'un est d'essayer d'obtenir le type d'une colonne dans une base de données, de faire 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);
Depuis val est déjà un Type d'objet, val.GetType() retournera un autre Type d'objet représentant le type System.RuntimeTime
que c'est le type de béton utilisé pour représenter le type d'origine de l'objet. Le blog montre également quelques réflexion inutile de ruse, pour obtenir le type de l'original type d'objet, alors qu'en réalité, tout ce qui était nécessaire, c'était:
Type type = reader.GetFieldType(index) as Type;
Donc, si votre Type
objet est qu'il représente un System.RuntimeType
, assurez-vous que vous n'avez pas accidentellement appelé GetType()
sur un type, vous l'avez déjà obtenu.