104 votes

Comment obtenir une propriété statique avec Reflection

Donc, ce semble assez basique mais je ne peux pas le faire fonctionner. J'ai un Objet, et je suis l'aide de la réflexion pour arriver à ça propriétés publiques. L'une de ces propriétés est statique et j'ai pas de chance d'arriver à elle.

Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
    Return obj.GetType.GetProperty(propName)

End Function

Le code ci-dessus fonctionne très bien pour le Public des propriétés d'une Instance, qui jusqu'à présent est tout ce que j'ai besoin. Soi-disant que je peux utiliser BindingFlags de demander à d'autres types de propriétés (privé, statique), mais je n'arrive pas à trouver la bonne combinaison.

Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
    Return obj.GetType.GetProperty(propName, Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public)

End Function

Mais encore, demandant à tous les membres Statiques ne retournent rien. .NET réflecteur peut voir les propriétés statiques très bien, donc clairement il me manque quelque chose ici.

123voto

Ernest Points 461

Ou simplement regarder ça ...

 Type type = typeof(MyClass); // MyClass is static class with static properties
foreach (var p in type.GetProperties())
{
   var v = p.GetValue(null, null); // static classes cannot be instanced, so use null...
}
 

41voto

earlNameless Points 2044

Ceci est C #, mais devrait vous donner l’idée:

 public static void Main() {
    typeof(Program).GetProperty("GetMe", BindingFlags.NonPublic | BindingFlags.Static);
}

private static int GetMe {
    get { return 0; }
}
 

(vous devez uniquement OU NONPublic et statique)

37voto

George Points 111

Un peu de clarté ...

 //get a PropertyIno of specific property type(T).GetProperty(....)
PropertyInfo propertyInfo = 
    typeof(TypeWithTheStaticProperty)
        .GetProperty("NameOfStaticProperty", BindingFlags.Public | BindingFlags.Static); 

//use the PropertyInfo to retrieve the value from the type by not passing in an instance
object value = propertyInfo.GetValue(null, null)

//cast the value to the desired type
ExpectedType typedValue = (ExpectedType) value;
 

28voto

Corey Downie Points 2494

Ok, la clé pour moi était donc d'utiliser le .FlattenHierarchy BindingFlag. Je ne sais pas vraiment pourquoi je l'ai simplement ajouté sur un pressentiment et ça a commencé à fonctionner. Donc, la solution finale qui me permet d’obtenir l’instance publique ou les propriétés statiques est la suivante:

 obj.GetType.GetProperty(propName, Reflection.BindingFlags.Public _
  Or Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or _
  Reflection.BindingFlags.FlattenHierarchy)
 

7voto

Igor Points 81
 myType.GetProperties(BindingFlags.Public | BindingFlags.Static |  BindingFlags.FlattenHierarchy);
 

Cela renverra toutes les propriétés statiques dans la classe de base statique ou un type particulier et probablement aussi le fils.

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