111 votes

Obtenir la valeur d'un champ public statique via la réflexion

Ceci est ce que j'ai fait jusqu'à présent :

 var fields = typeof (Settings.Lookup).GetFields();
 Console.WriteLine(fields[0].GetValue(Settings.Lookup)); 
         // Erreur de compilation, le nom de la classe n'est pas valide à ce stade

Et voici ma classe statique :

public static class Settings
{
   public static class Lookup
   {
      public static string F1 ="abc";
   }
}

10 votes

Juste une note qu'appeler la variable props plutôt que fields risque de confondre un développeur futur. Les propriétés sont des choses distinctes, et les champs ne le sont certainement pas.

198voto

Thomas Levesque Points 141081

Vous devez passer null à GetValue, car ce champ n'appartient à aucune instance :

fields[0].GetValue(null)

2 votes

Il n'y a pas de surcharge prenant un seul paramètre? msdn.microsoft.com/en-us/library/…

5 votes

@Pauli : malgré le nom de la variable, il s'agit d'un FieldInfo, pas d'un PropertyInfo.

29voto

Matías Fidemraizer Points 16842

Vous devez utiliser la surcharge Type.GetField(System.Reflection.BindingFlags) :

Par exemple :

FieldInfo field = typeof(Settings.Lookup).GetField("Lookup", BindingFlags.Public | BindingFlags.Static);

Settings.Lookup lookup = (Settings.Lookup)field.GetValue(null);

0 votes

Pour une raison quelconque, j'ai dû ajouter ces indicateurs pour que cela fonctionne : BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy

8voto

Pauli Østerø Points 4708

La signature de FieldInfo.GetValue est

public abstract Object GetValue(
    Object obj
)

obj est l'instance de l'objet dont vous voulez récupérer la valeur ou null s'il s'agit d'une classe statique. Donc cela devrait fonctionner :

var props = typeof (Settings.Lookup).GetFields();
Console.WriteLine(props[0].GetValue(null));

1 votes

Ne faites pas confiance aux noms de variables... l'OP appelle GetFields, pas GetProperties ;)

0 votes

@PauliØsterø à quoi correspond le deuxième null ? FieldInfo.GetValue n'accepte-t-il pas uniquement un seul paramètre ? Je ne semble pas trouver de surcharges de GetValue ou quoi que ce soit

0 votes

@ThomasFlinkow simple erreur de frappe, c'est corrigé maintenant

5voto

Aliostad Points 47792

Essayez ceci

FieldInfo fieldInfo = typeof(Settings.Lookup).GetFields(BindingFlags.Static | BindingFlags.Public)[0];
    object value = fieldInfo.GetValue(null); // value = "abc"

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