2017-04-27 1 views
2

Disons que je classe:Obtenez les membres de la classe personnalisée pour lire leurs valeurs

public class TestClass 
{ 
    public string Prop1 { get; set; } 
    public int Field1 = 1234567890; 
    public string Method1() { return "ABCDEFGHIJKLMNOPQRSTUVXYZ"; } 
} 

... instance de classe et la liste:

TestClass TC = new TestClass();  
List<object> TCValues = new List<object>(); 

... et remplir la liste des valeurs boucle:

 foreach (var v in TC.GetType().GetProperties()) // or .GetFields() 
     { 
      TCValues.Add(v.GetValue(TC, null));     
     } 

... problème est que dans mon cas particulier, je dois obtenir la liste de tous les membres de la classe, puis les filtrer les propriétés et champs (en ignorant les méthodes de cours), puis lire leurs valeurs comme je l'ai fait dans le premier exemple:

 foreach (var v in TC.GetType().GetMembers()) 
     { 
      if (v.MemberType == System.Reflection.MemberTypes.Property || v.MemberType == System.Reflection.MemberTypes.Field) 
      { 
       TCValues.Add(v.?????????); // Can't get values ! 
      } 
     } 

... Je comprends que GetMembers() rendements classe MemberInfo qui, contrairement à PropertyInfo et FieldInfo ne contiennent pas de méthode GetValue(). Existe-t-il un moyen de lire les valeurs de la propriété filtrée et des membres du champ à l'intérieur de la boucle en itérant à travers la collection MemberInfo?

Répondre

1

Dans votre foreach boucle essayer

foreach (var v in TC.GetType().GetMembers()) 
{ 
    if (v is PropertyInfo) 
    { 
     var value = ((PropertyInfo)v).GetValue(TC, null); 
     TCValues.Add(value); 
    } 
    else if (v is FieldInfo) 
    { 
     var value = ((FieldInfo) v).GetValue(TC); 
     TCValues.Add(value); 
    } 
} 
+0

merci. Donc, si je comprends bien, 'MemberInfo' est la base de 'PropertyInfo' et 'FieldInfo'. Je ne peux pas voir 'GetValue()' parce que 'MemberInfo' ne pointe pas dessus, donc j'ai besoin de le lancer comme f.e. 'FieldInfo' pour voir la méthode 'GetValue()'. – cembo

+0

Oui, MemberInfo est la classe de base de PropertyInfo et FieldInfo. Mais il n'expose pas GetValue() car les implémentations et la signature sont différentes pour les propriétés et les champs. – MiGro

-1

Vous devez jeter les membres du type correct:

foreach (var v in TC.GetType().GetMembers()) 
{ 
    if (v.MemberType == System.Reflection.MemberTypes.Property) 
    { 
     TCValues.Add(((System.Reflection.PropertyInfo)v).GetValue(TC,null)); 
    } 
    else if (v.MemberType == System.Reflection.MemberTypes.Field) 
    { 
     TCValues.Add(((System.Reflection.FieldInfo)v).GetValue(TC)); 
    } 
}