C # - перебор и вызов членов класса - PullRequest
4 голосов
/ 16 августа 2010

Я пытаюсь перебрать членов статического класса и вызвать все члены, являющиеся полями. Я получаю исключение MissingFieldException в строке, где я пытаюсь вызвать участника.

Примерно так:

"Поле '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}

Он взрывается, когда попадает в индекс 4 в цикле foreach (там действительно есть «A»).

Я передал значение null для второго по значению параметра в InvokeMember (), потому что это статический класс, и здесь нет ничего подходящего для передачи. Я полагаю, что моя проблема связана с этим.

Возможно ли то, что я пытаюсь сделать? Может быть, я поступаю совершенно неправильно. Также, пожалуйста, дайте мне знать, если некоторые из этих BindingsFlags являются лишними.

Ответы [ 2 ]

12 голосов
/ 16 августа 2010

Если вы знаете, что хотите только общедоступные статические поля для класса, тогда вам, вероятно, лучше использовать следующее:

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

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

Это обеспечит возврат только правильных членови вы можете получить значения полей.

3 голосов
/ 16 августа 2010

Это потому, что A - это static, но вы используете BindingFlags.Instance для вызова InvokeMember.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...