【问题标题】:Get value of a public static field via reflection通过反射获取公共静态字段的值
【发布时间】:2011-05-05 13:22:10
【问题描述】:

这是我到目前为止所做的:

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

这是我的静态类:

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

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    您需要将null 传递给GetValue,因为该字段不属于任何实例:

    fields[0].GetValue(null)
    

    【讨论】:

      【解决方案2】:

      你需要使用 Type.GetField(System.Reflection.BindingFlags) 重载:

      例如:

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

      【讨论】:

      • 出于某种原因,我必须添加这些标志才能使其工作:BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy
      【解决方案3】:

      FieldInfo.GetValue的签名是

      public abstract Object GetValue(
          Object obj
      )
      

      其中obj 是您要从中检索值的对象实例,如果是静态类,则为null。所以应该这样做:

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

      【讨论】:

      • 不要信任变量名... OP 调用的是 GetFields,而不是 GetProperties ;)
      • @PauliØsterø 第二个null 对应什么? FieldInfo.GetValue 不只接受一个参数吗?我似乎找不到 GetValue 或任何内容的重载
      • @ThomasFlinkow 只是错字,现在已修复
      • @PauliØsterø 这么想 :) 只是想确保问题中的代码已准备好复制粘贴。所以 +1 是一个很好的答案。
      【解决方案4】:

      试试这个

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

      【讨论】:

        猜你喜欢
        • 2018-11-09
        • 1970-01-01
        • 1970-01-01
        • 2016-01-08
        • 1970-01-01
        • 1970-01-01
        • 2013-08-15
        相关资源
        最近更新 更多