Подтвердить что ты не робот

Ошибка определения свойства не найдена при отражении

Я пытаюсь отразить некоторые свойства класса и установить их программно, но похоже, что один из моих фильтров PropertyInfo не работает:

//Get all public or private non-static properties declared in this class (no inherited properties) - that have a getter and setter.
PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.SetProperty );

Я получаю сообщение об ошибке в строке

pi.SetValue(this, valueFromData, null);

Поскольку свойство имеет только метод get{}, метод set{}.

Мой вопрос: почему это свойство не было отфильтровано из реквизита? Я думал, что это была цель BindingFlags.SetProperty.

Свойство, которое не получает отфильтровано, равно:

    public String CollTypeDescription
    {
        get { return _CollTypeDescription; }
    }

Обратите внимание, что я хочу фильтровать свойства, которые не будут работать раньше времени, потому что я перечисляю их все сразу. Я действительно не хочу использовать pi.GetSetMethod() после того, как определить, могу ли я использовать setter.

4b9b3361

Ответ 1

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

BindingFlags.SetProperty

Указывает, что значение указанного свойства должно быть установлено. Для Свойства COM, указывающие этот флаг привязки, эквивалентны указав PutDispProperty и PutRefDispProperty.

BindingFlags.SetProperty и BindingFlags.GetProperty не свойства фильтра, которые не содержат сеттеры или геттеры соответственно.

Чтобы проверить, можно ли установить свойство, используйте свойство CanWrite.

if (pi.CanWrite)
    pi.SetValue(this, valueFromData, null);

Ответ 2

Благодаря ken для информации. Это похоже на лучшее решение, которое я могу получить, чтобы отфильтровать их путем тестирования GetSetMethod (true) в фильтре LINQ:

//Get all public or private non-static properties declared in this class (no inherited properties) - that have a getter and setter.
PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Where(p => p.GetGetMethod(true) != null && p.GetSetMethod(true) != null).ToArray();

Ответ 3

Я понимаю метод GetProperties(), чтобы он возвращал каждое свойство с BindingFlags.GetProperty или BindingFlags.SetProperty.
Поэтому, если вы хотите только свойства, у которых есть сеттеры, вы должны удалить флаг BindingFlags.GetProperty. Но я не проверял его, поэтому я могу ошибаться.

Мой ответ получил -1. Поэтому кажется, что мой ответ неправильный.