System.RuntimeType
est une classe concrète qui dérive de la classe de base abstraite System.Type
. Puisqu'il System.RuntimeType
n'est pas public, vous en rencontrerez généralement des instances comme System.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. Puis Type.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();
strTypeType.ToString();
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 a System.RuntimeType
, assurez-vous que vous n'avez pas accidentellement appelé GetType()
un type que vous avez déjà.