繁体   English   中英

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

[英]Get only protected members via .net reflection

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM