我正在尝试迭代静态类的成员并调用所有字段成员。我在尝试调用该成员的行上遇到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是多余的,请告诉我。
答案 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)
那是因为A
是static
,但您使用BindingFlags.Instance
来致电InvokeMember
。