Ошибка определения свойства не найдена при отражении
Я пытаюсь отразить некоторые свойства класса и установить их программно, но похоже, что один из моих фильтров 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.
Ответы
Ответ 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. Поэтому кажется, что мой ответ неправильный.