当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《仅通过.net反射获取受保护的成员》经验,为你挑选了1个好方法。

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

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

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



1> Tamir Vered..:

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

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();
    ...
}

static readonly MemberFilter PrivatePropertyFilter = (objMemberInfo, objSearch) =>
{
    PropertyInfo info = (objMemberInfo as PropertyInfo);
    if (info == null)
    {
        return false;
    }
    return info.GetMethod.IsPrivate && info.SetMethod.IsPrivate;
};

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有