【问题标题】:Get all fields from static classes inside static class with reflection使用反射从静态类中获取静态类的所有字段
【发布时间】:2013-03-12 16:25:39
【问题描述】:

我有一个包含很多静态类的静态类。每个内部静态类都包含字段。我想获取所有内部静态类的所有字段。

public static class MyClass
{
    public static class MyInnerClass1
    {
        public const string Field1 = "abc";
        public const string Field2 = "def";
        public const string Field3 = "ghi";
    }
    public static class MyInnerClass2
    {
        public const int Field1 = 1;
        public const int Field2 = 2;
        public const int Field3 = 3;
    }
    ...
}

我想打印出每个内部类的名称,然后是每个字段的名称和值。

例如:

我的内部类

字段1 = "abc"

...

获取所有类的名称我没有问题:

var members = typeof(MyClass).GetMembers(BindingFlags.Public | BindingFlags.Static);

var str = ""; 
foreach (var member in members)
{
    str += member.Name +" ";             
}

或特定类中所有字段的名称和值:

var fields = typeof(MyClass.MyInnerClass1).GetFields();
foreach (var field in fields)
{
    str += field.Name + "-";
    str += field.GetValue(typeof(MyClass.MyInnerClass1));
}

但是我该如何组合呢? 内部静态类的名称和数量可能会发生变化。

【问题讨论】:

    标签: c# class reflection static


    【解决方案1】:

    试试下面的

    var builder = new StringBuilder();
    foreach (var type in typeof(MyClass).GetNestedTypes(BindingFlags.Public | BindingFlags.NonPublic))
    {
      if (!type.IsAbstract)
      {
         continue;
      }
    
      builder.AppendLine(type.Name);
      foreach (var field in type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static)) {
         var msg = String.Format("{0} = {1}", field.Name, field.GetValue(null));
         builder.AppendLine(msg);
      }
    }
    
    string output = builder.ToString();
    

    使用!type.IsAbstract 是为了清除非静态嵌套类型。 C# 中的静态类型在后台生成为 abstract

    此外,我的解决方案将同时获取 public 和非公共成员(类型和字段)。我不确定这是否是您的意图,因此您可能想要修改我的解决方案的那一部分。

    【讨论】:

      【解决方案2】:

      你需要递归循环遍历type.GetNestedTypes()

      IEnumerable<FieldInfo> GetAllFields(Type type) {
          return type.GetNestedTypes().SelectMany(GetAllFields)
                     .Concat(type.GetFields());
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-22
        • 1970-01-01
        • 2010-11-22
        相关资源
        最近更新 更多