2011-09-26 1 views
4

私は型を反映させようとしており、パブリックセッターでプロパティのみを取得しようとしているときに、保護されたセッターをフィルタリングします。これは私のために働いていないようです。下の例のLinqPadスクリプトでは、 'Hello'と一緒に 'Id'と 'InternalId'が返されます。フィルタリングするにはどうすればよいですか?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()は、それが1つを持っていない場合、それはnullを返す、メソッドの公開セッターを返します。

プロパティはセッターとは異なる可視性を持つことがあるため、セッターメソッドの可視性によってフィルターする必要があります。

+1

前回私は.CanWriteプロパティを信頼しました!ありがとう! – mcintyre321