79 votes

Quelle est la différence entre le Système.Type et du Système.RuntimeType en C#?

J'ai essayé de faire quelque convention de tests aujourd'hui, et d'obtenir tous les types dans un assembly (Assemblée.GetTypes()), quand je suis tombé sur quelque chose:

Système.RuntimeType:[Premier.Espace de noms.FirstClass]

Chaque fois que j'essaie de comparer ce type avec typeof(première classe), ils ne sont pas égaux. Donc, quand j'ai essayer de trouver tous les types qui contiennent FirstClass comme un paramètre générique, je ne suis pas le trouver.

Quelle est la différence entre RuntimeType et le Type? Est-il un moyen de résoudre mon problème?

98voto

Ergwun Points 5293

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.

3voto

John Saunders Points 118808

De la réponse à Différents entre le Système.Type et du Système.RuntimeType par Thomas Danecker:

Système.Le Type est une classe de base abstraite. Le CLR a c'est du béton mise en œuvre dans le type interne Système.RuntimeType. En raison de cette typeof(string).GetType() renvoie un RuntimeType mais typeof(Type) renvoie un de Type normal. À l'aide de l' .Méthode Equals en fait, un objet.ReferenceEquals qui renvoie la valeur false. Pour obtenir le attend les résultats, vous pouvez utiliser type.IsInstanceOfType(élément). Cette sera également retourne true si l'élément est de un type dérivé. Si vous voulez vérifier pour le type exact, le retour de la valeur de faux de votre méthode est souhaitée résultat. Vous pouvez également utiliser checkType(arrayType, Type.GetType("Le Système De.RuntimeType")) de vérifier la RuntimeType.

0voto

Andrei Points 885

Jetez un oeil à ce blog, le gars parle de la différence. Regarde-moi ces classes sont le résultat d' .NET optimisation:

http://blogs.msdn.com/b/vancem/archive/2006/10/01/779503.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X