Фильтрация защищенных сеттеров, когда type.GetProperties () - PullRequest
5 голосов
/ 26 сентября 2011

Я пытаюсь отразить тип и получить только свойства с открытыми сеттерами. Кажется, это не работает для меня. В приведенном ниже примере сценария LinqPad «Id» и «InternalId» возвращаются вместе с «Hello». Что я могу сделать, чтобы отфильтровать их?

void Main()
{
    typeof(X).GetProperties(BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance)
    .Select (x => x.Name).Dump();
}

public class X
{
    public virtual int Id { get; protected set;}
    public virtual int InternalId { get; protected internal set;}
    public virtual string Hello { get; set;}
}

1 Ответ

5 голосов
/ 26 сентября 2011

Вы можете использовать GetSetMethod () , чтобы определить, является ли сеттер общедоступным или нет.

Например:

typeof(X).GetProperties(BindingFlags.SetProperty |
                        BindingFlags.Public |
                        BindingFlags.Instance)
    .Where(prop => prop.GetSetMethod() != null)
    .Select (x => x.Name).Dump();

GetSetMethod() возвращает открытый метод установки метода, если его нет, он возвращает null.

Поскольку свойство может иметь видимость, отличную от сеттера, его необходимо фильтровать по видимости метода сеттера.

...