Obtenha o valor de um campo estático público por meio de reflexão

85

Isso é o que eu fiz até agora:

 var fields = typeof (Settings.Lookup).GetFields();
 Console.WriteLine(fields[0].GetValue(Settings.Lookup)); 
         // Compile error, Class Name is not valid at this point

E esta é minha classe estática:

public static class Settings
{
   public static class Lookup
   {
      public static string F1 ="abc";
   }
}
Omu
fonte
10
Apenas uma observação de que chamar a variável em propsvez de fieldspode confundir um futuro desenvolvedor. As propriedades são suas próprias coisas e os campos definitivamente não são eles.
ErikE

Respostas:

161

Você precisa passar nullpara GetValue, uma vez que este campo não pertence a nenhuma instância:

props[0].GetValue(null)
Thomas Levesque
fonte
2
não há sobrecarga tomando apenas um parâmetro? msdn.microsoft.com/en-us/library/…
Pauli Østerø
4
@Pauli: apesar do nome da variável, este é um FieldInfo, não um Propertyinfo
Thomas Levesque
18

Você precisa usar a sobrecarga de Type.GetField (System.Reflection.BindingFlags):

Por exemplo:

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

Settings.Lookup lookup = (Settings.Lookup)field.GetValue(null);
Matías Fidemraizer
fonte
7

A assinatura de FieldInfo.GetValueé

public abstract Object GetValue(
    Object obj
)

onde objé a instância do objeto da qual você deseja recuperar o valor ou nullse é uma classe estática. Então, isso deve fazer:

var props = typeof (Settings.Lookup).GetFields();
Console.WriteLine(props[0].GetValue(null)); 
Pauli Østerø
fonte
1
Não confie em nomes de variáveis ​​... o OP está chamando GetFields, não GetProperties;)
Thomas Levesque
@ PauliØsterø a que nullcorresponde o segundo ? Não FieldInfo.GetValueaceita apenas um único parâmetro? Não consigo encontrar sobrecargas de GetValuenem nada
Thomas Flinkow
@ThomasFlinkow mero erro de digitação, está corrigido agora
Pauli Østerø
@ PauliØsterø achou que sim :) só queria ter certeza de que o código em questão está pronto para copiar e colar. Então, +1 para uma boa resposta.
Thomas Flinkow
4

Tente isto

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