Как я могу найти все общедоступные поля объекта в C#?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
14
задан Robert Harvey 7 September 2018 в 15:31
поделиться

5 ответов

foreach (Object obj in list) {
    Type type = obj.GetType();

    foreach (var f in type.GetFields().Where(f => f.IsPublic)) {
        Console.WriteLine(
            String.Format("Name: {0} Value: {1}", f.Name, f.GetValue(obj));
    }                           
}

Примечание, что этот код требует, чтобы.NET 3.5 работала ;-)

26
ответ дан 1 December 2019 в 06:49
поделиться
public static void ListArrayListMembers(ArrayList list)
{
    foreach (Object obj in list)
    {
        Type type = obj.GetType();
        Console.WriteLine("{0} -- ", type.Name);
        Console.WriteLine(" Properties: ");
        foreach (PropertyInfo prop in type.GetProperties())
        {
            Console.WriteLine("\t{0} {1} = {2}", prop.PropertyType.Name, 
                prop.Name, prop.GetValue(obj, null));
        }
        Console.WriteLine(" Fields: ");
        foreach (FieldInfo field in type.GetFields())
        {
            Console.WriteLine("\t{0} {1} = {2}", field.FieldType.Name, 
                field.Name, field.GetValue(obj));
        }
    }
}

я хотел бы упомянуть, что поиск IsPublic в полях не необходим как тип. GetFields (), как определено состояния MSDN:

Возвращаемое значение - Тип: Система. Отражение. FieldInfo []

массив объектов FieldInfo, представляющих весь общедоступные поля определенный для текущего Типа.

4
ответ дан 1 December 2019 в 06:49
поделиться

Можно получить все поля объекта, объявленные непосредственно в классе с BindingFlags:

GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)

и все поля объекта включая наследованный с:

GetFields(BindingFlags.Public | BindingFlags.Instance)
8
ответ дан 1 December 2019 в 06:49
поделиться

Конечно, другой вопрос был бы, "почему Вы получили общедоступные поля?" - свойства, являющиеся предпочтительным. Как абстракция, обратите внимание, что отражение не является единственной опцией: для типа также возможно выставить, это - свойства на лету во времени выполнения (как то, как невведенный DataTable / DataView выставляет столбцы как свойства).

Для поддержки этого (также поддерживая простые объекты) Вы использовали бы TypeDescriptor:

        foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
        {
            Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
        }

Это также допускает многочисленные опции расширяемости - например, значительно убыстряющееся отражение (не изменяя кода).

3
ответ дан 1 December 2019 в 06:49
поделиться
    static void ListArrayListMembers(ArrayList list)
    {
        foreach (object obj in list)
        {
            Type type = obj.GetType();
            foreach (FieldInfo field in type.GetFields(BindingFlags.Public))
            {
                Console.WriteLine(field.Name + " = " + field.GetValue(obj).ToString());
            }
        }
    }
1
ответ дан 1 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: