16

多くの静的クラスを含む静的クラスがあります。各内部静的クラスにはフィールドが含まれています。すべての内部静的クラスのすべてのフィールドを取得したい。

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

しかし、これをどのように組み合わせるのですか?内部静的クラスの名前と数は変更される場合があります。

4

2 に答える 2

18

次を試してください

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非公開メンバー(タイプとフィールドの両方)の両方を取得します。これがあなたの意図であったかどうかはわかりませんので、私のソリューションのその部分を変更することをお勧めします。

于 2013-03-12T16:32:13.723 に答える
12

再帰的にループする必要がありますtype.GetNestedTypes():

IEnumerable<FieldInfo> GetAllFields(Type type) {
    return type.GetNestedTypes().SelectMany(GetAllFields)
               .Concat(type.GetFields());
}
于 2013-03-12T16:27:22.257 に答える