2015-12-20 317 views
1

這將返回所有非公共實例屬性僅獲得保護的成員:通過.NET反射

var instanceNonPublic = currentType.GetProperties (BindingFlags.Instance | 
                BindingFlags.NonPublic); 

但是有什麼辦法來確定哪些訪問修飾符適用於每個屬性? private,internalprotected

回答

5

由於性質是由get方法和set方法,你可以重複他們並使用他們getset方法訪問修飾符過濾相關PropertyInfo S:

var instancePrivate = currentType.GetProperties(BindingFlags.Instance | 
               BindingFlags.NonPublic) 
    .Where(x => x.GetMethod.IsPrivate && 
       x.SetMethod.IsPrivate); 

這些都是有趣的訪問修飾符:

  • IsPrivate表示該方法是private
  • IsFamily表示該方法是protected
  • IsAssembly表示該方法是internal

能夠完美地設置過濾其它方式使用FindMembers

public void YourMethod() 
{ 
    ... 
    var instancePrivate = currentType.FindMembers(MemberTypes.Property, 
                BindingFlags.Instance | 
                BindingFlags.NonPublic, 
                PrivateMemberFilter, null); 
     .OfType<PropertyInfo>(); 
    ... 
} 

static readonly MemberFilter PrivatePropertyFilter = (objMemberInfo, objSearch) => 
{ 
    PropertyInfo info = (objMemberInfo as PropertyInfo); 
    if (info == null) 
    { 
     return false; 
    } 
    return info.GetMethod.IsPrivate && info.SetMethod.IsPrivate; 
};