繁体   English   中英

从静态类中的静态类中获取带反射的所有字段

[英]Get all fields from static classes inside static class with reflection

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

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;
    }
    ...
}

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

例如:

MyInnerClass

Field1 =“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));
}

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

请尝试以下方法

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和非公共成员(包括类型和字段)。 我不确定这是不是你的意图,所以你可能想要修改我的解决方案的那一部分。

您需要以递归方式遍历type.GetNestedTypes()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM