C# 通过.net反射仅获取受保护的成员
这将返回所有非公共实例属性:C# 通过.net反射仅获取受保护的成员,c#,.net,system.reflection,C#,.net,System.reflection,这将返回所有非公共实例属性: var instanceNonPublic = currentType.GetProperties (BindingFlags.Instance | BindingFlags.NonPublic); 但有没有办法确定哪个访问修饰符应用于每个属性private、internal或protected?由于属性由get方法和set方法组成,因此您可以迭代它们,并使用它们
var instanceNonPublic = currentType.GetProperties (BindingFlags.Instance |
BindingFlags.NonPublic);
但有没有办法确定哪个访问修饰符应用于每个属性
private
、internal
或protected
?由于属性由get
方法和set
方法组成,因此您可以迭代它们,并使用它们的get
和set
方法的访问修饰符过滤相关的属性信息:
var instancePrivate = currentType.GetProperties(BindingFlags.Instance |
BindingFlags.NonPublic)
.Where(x => x.GetMethod.IsPrivate &&
x.SetMethod.IsPrivate);
以下是有趣的访问修饰符:
var instancePrivate = currentType.GetProperties(BindingFlags.Instance |
BindingFlags.NonPublic)
.Where(x => x.GetMethod.IsPrivate &&
x.SetMethod.IsPrivate);
IsPrivate
表示方法是private
IsFamily
表示该方法受保护
IsAssembly
表示方法是内部的
另一种优雅地设置过滤器的方法是使用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;
};
public方法()
{
...
var instancePrivate=currentType.FindMembers(MemberTypes.Property,
BindingFlags.Instance|
BindingFlags.NonPublic,
PrivateMemberFilter,空);
.of type();
...
}
静态只读成员筛选器PrivatePropertyFilter=(objMemberInfo,objSearch)=>
{
PropertyInfo info=(objMemberInfo作为PropertyInfo);
if(info==null)
{
返回false;
}
return info.GetMethod.IsPrivate&&info.SetMethod.IsPrivate;
};