这将返回所有非公共实例属性:
var instanceNonPublic = currentType.GetProperties (BindingFlags.Instance | BindingFlags.NonPublic);
但有没有办法确定哪个访问修饰符适用于每个属性?private
,internal
还是protected
?
由于属性是由get
方法和set
方法组成的,因此您可以PropertyInfo
使用它们get
和set
方法的访问修饰符迭代它们并过滤相关的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(); ... } static readonly MemberFilter PrivatePropertyFilter = (objMemberInfo, objSearch) => { PropertyInfo info = (objMemberInfo as PropertyInfo); if (info == null) { return false; } return info.GetMethod.IsPrivate && info.SetMethod.IsPrivate; };