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

Get only protected members via .net reflection

此returns所有非public实例属性:

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

但是有什么方法可以确定哪个访问修饰符适用于每个 属性? privateinternalprotected?

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

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