C# - 迭代并调用类成员

时间:2010-08-16 17:59:18

标签: c# reflection class loops

我正在尝试迭代静态类的成员并调用所有字段成员。我在尝试调用该成员的行上遇到MissingFieldException。

这样的事情:

找不到“Field'NamespaceStuff.MyClass + MyStaticClass.A'。”

public class MyClass {
    public MyClass() {
        Type type = typeof(MyStaticClass);
        MemberInfo[] members = type.GetMembers();

        foreach(MemberInfo member in members) {
            if (member.MemberType.ToString() == "Field")
            {
                // Error on this line
                int integer = type.InvokeMember(member.Name,
                                            BindingFlags.DeclaredOnly |
                                            BindingFlags.Public | 
                                            BindingFlags.Instance |
                                            BindingFlags.GetField,
                                            null, null, null);
            }
        }
    }
}

public static class MyStaticClass
{
    public static readonly int A = 1;
    public static readonly int B = 2;
    public static readonly int C = 3;
}

数组“members”看起来像这样:

 [0]|{System.String ToString()}
 [1]|{Boolean Equals(System.Object)}
 [2]|{Int32 GetHashCode()}
 [3]|{System.Type GetType()}
 [4]|{Int32 A}
 [5]|{Int32 B}
 [6]|{Int32 C}

当它在foreach循环中变为索引4时会爆炸('A'确实在那里)。

我为InvokeMember()中的倒数第二个参数传入null,因为它是一个静态类,并且没有什么适合传入这里。我猜我的问题与此有关。

我正在尝试做什么?也许我完全是错误的方式。另外,如果其中一些BindingsFlags是多余的,请告诉我。

2 个答案:

答案 0 :(得分:12)

如果您知道在课程中只需要公共静态字段,那么最好使用以下内容:

Type type = typeof (MyStaticClass);
var fields = type.GetFields(BindingFlags.Static | BindingFlags.Public);

foreach (FieldInfo field in fields)
{
    var fieldValue = (int)field.GetValue(null);   
}

这将确保只返回正确的成员,并且您可以获得字段值。

答案 1 :(得分:3)

那是因为Astatic,但您使用BindingFlags.Instance来致电InvokeMember