2010-09-27 9 views
0

J'essaie de trouver la première propriété d'une classe qui est un Integer .. et obtenir sa valeur.Essayer d'utiliser la réflexion pour trouver la première propriété Int32 d'une classe

donc j'ai le code suivant .. qui retourne toujours faux:

foreach(var property in type.GetProperties(BindingFlags.Public | 
    BindingFlags.Instance)) 
{ 
    var someType = property.PropertyType is int; // Always false. 
} 

Pourquoi est-ce/qu'ai-je fait de mal. Cela devrait être très simple :(

/moi est d'avoir une mauvaise journée ...

Répondre

4

Modifier le test:

var firstInt32Property = property.PropertyType == typeof(int); 

Cela est nécessaire parce que la propriété de propriété de type est lui-même pas un entier: il est un objet System.Type que (vaguement) représente le type du rendement propriété getter/propriété compositeur accepte d'autre part, invoquant le getter de la propriété sur une instance du contenant de type produira une réelle. nombre entier

est ici un moyen d'utiliser LINQ au lieu de la boucle foreach: (. Cela lèvera une exception si cette propriété existe)

var firstInt32Property = type.GetProperties(BindingFlags.Public | BindingFlags.Instance) 
          .First(p => p.PropertyType == typeof(int)); 


Pour récupérer la valeur de la propriété à partir d'une instance du type contenant:

int value = (int)firstInt32Property.GetValue(myObj, null); 

Ceci échouera bien sûr si t La propriété 'Int32' se trouve être un indexeur ou même s'il n'a pas de getter. Vous pouvez filtrer ces propriétés sur la requête d'origine si de tels scénarios sont probables.


Notez également que ce code est d'une utilité limitée parce que l'idée de « la première propriété d'une classe qui est un entier » est un suspect petit peu. De Type.GetProperties:

La méthode GetProperties ne pas propriétés de retour dans un ordre particulier, comme alphabétique ou ordre de déclaration. Votre code ne doit pas dépendre de l'ordre dans lequel propriétés sont retournées, parce que ordre varie.

+3

Vous pouvez utiliser == au lieu de Equals ici, comme des objets de type sont uniques pour un type particulier. Pas une critique - votre code fonctionnera, bien sûr - je trouve simplement == plus facile à lire. –

+0

Hmm .. aucune idée comment je définis la première propriété. Je veux dire, certaines classes ont un 'int' comme leur première propriété pour les choses. Je voudrais vraiment créer une 'Interface' qui signifie que je peux facilement saisir la propriété que je suis après pour toute instance qui implémente cette interface .. mais je ne peux pas faire ça ici. De toute façon, je ne suis pas en train de saisir la "mauvaise" propriété int, en fait. Ceci est juste pour quelques trucs de R & D. –

+0

+1 exactement, ce qui est dans PropertyType n'est pas une instance de int, est une instance de System.Type. – eglasius