Метод GetProperties с BindingFlags.Public ничего не возвращает - PullRequest
30 голосов
/ 03 июля 2011

Возможно, это глупый вопрос, но я не смог найти объяснений в Интернете.
Какова конкретная причина того, что этот код не работает?Предполагается, что код копирует значения свойств из Contact (исходный) в недавно созданный объект ContactBO (конечный).

public ContactBO(Contact contact)
{
    Object source = contact;
    Object destination = this;

    PropertyInfo[] destinationProps = destination.GetType().GetProperties(
        BindingFlags.Public);
    PropertyInfo[] sourceProps = source.GetType().GetProperties(
        BindingFlags.Public);

    foreach (PropertyInfo currentProperty in sourceProps)
    {
        var propertyToSet = destinationProps.First(
            p => p.Name == currentProperty.Name);

        if (propertyToSet == null)
            continue;

        try
        {
            propertyToSet.SetValue(
                destination, 
                currentProperty.GetValue(source, null), 
                null);
        }
        catch (Exception ex)
        {
            continue;
        }
    }
}

Оба класса имеют одинаковые имена свойств (класс BO имеетнесколько других, но они не имеют значения при инициализации).Оба класса имеют только общедоступные свойства.Когда я запускаю приведенный выше пример, destinationProps и sourceProps имеют нулевую длину.

Но когда я расширяю метод GetProperties с помощью BindingFlags.Instance, он неожиданно возвращает все.Буду признателен, если кто-нибудь сможет пролить свет на этот вопрос, потому что я заблудился.

Ответы [ 2 ]

45 голосов
/ 03 июля 2011

Из документации метода GetProperties:

Для получения возврата необходимо указать либо BindingFlags.Instance, либо BindingFlags.Static.1008 *

26 голосов
/ 03 июля 2011

Это связано с тем, что в BindingFlags необходимо указать члены Static или Instance.BindingFlags - это перечисление флагов, которое можно объединить, используя | (поразрядно или).

То, что вы хотите:

.GetProperties(BindingFlags.Instance | BindingFlags.Public);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...