fla*_*ffl 14 c# reflection static class
我有一个包含很多静态类的静态类.每个内部静态类都包含字段.我想得到所有内部静态类的所有字段.
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;
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想打印出每个内部类的名称,后跟每个字段的名称和值.
例如:
MyInnerClass
Field1 ="abc"
...
获取所有类的名称没有问题:
var members = typeof(MyClass).GetMembers(BindingFlags.Public | BindingFlags.Static);
var str = "";
foreach (var member in members)
{
str += member.Name +" ";
}
Run Code Online (Sandbox Code Playgroud)
或者特定类中所有字段的名称和值:
var fields = typeof(MyClass.MyInnerClass1).GetFields();
foreach (var field in fields)
{
str += field.Name + "-";
str += field.GetValue(typeof(MyClass.MyInnerClass1));
}
Run Code Online (Sandbox Code Playgroud)
但是我如何结合这个呢?内部静态类的名称和数量可能会发生变化.
Jar*_*Par 17
请尝试以下方法
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();
Run Code Online (Sandbox Code Playgroud)
!type.IsAbstract在非静态嵌套类型上进行杂草的使用.C#中的静态类型在abstract引擎盖下生成.
此外,我的解决方案将选择public非公共成员(包括类型和字段).我不确定这是不是你的意图,所以你可能想要修改我的解决方案的那一部分.
SLa*_*aks 10
你需要递归循环type.GetNestedTypes():
IEnumerable<FieldInfo> GetAllFields(Type type) {
return type.GetNestedTypes().SelectMany(GetAllFields)
.Concat(type.GetFields());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10872 次 |
| 最近记录: |