Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过.net反射仅获取受保护的成员_C#_.net_System.reflection - Fatal编程技术网

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