2011-09-26 4 views
4

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

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;} 
} 

ответ

4

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

Например:

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

В GetSetMethod() возвращается общественности сеттер метода, если он не имеет его, возвращает null.

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

+1

Последнее время я доверяю собственности .CanWrite! благодаря! – mcintyre321