仅通过.net反射获取受保护的成员

Myl*_*ell 1 .net c# system.reflection

这将返回所有非公共实例属性:

var instanceNonPublic = currentType.GetProperties (BindingFlags.Instance |
                                                   BindingFlags.NonPublic);
Run Code Online (Sandbox Code Playgroud)

但有没有办法确定哪个访问修饰符适用于每个属性?private,internal还是protected

Tam*_*red 5

由于属性是由get方法和set方法组成的,因此您可以PropertyInfo使用它们getset方法的访问修饰符迭代它们并过滤相关的s :

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

这些是有趣的访问修饰符:

  • 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;
};
Run Code Online (Sandbox Code Playgroud)