如何确定MemberInfo实例的可访问性?

时间:2010-10-14 07:45:59

标签: .net reflection

我知道BindingFlags用于从Type中获取公共成员和非公共成员。

但是有没有办法确定MemberInfo实例(或者像PropertyInfo,MethodInfo这样的派生)是否公开(在从Type上的某个方法返回之后)?

感谢名单, 马克

2 个答案:

答案 0 :(得分:7)

PropertyInfoMethodBase等每个都有Attributes属性,其中包含此信息 - 但MemberInfo中没有任何内容,因为每种成员都有自己的属性枚举。虽然很隐蔽,但我认为可能需要单独处理MemberInfo的每个子类:(您可以打开MemberInfo.MemberType然后进行强制转换,这将是略微比许多as / test-for-null分支更好,但它仍然不理想:(

if (member.MemberType == MemberTypes.Property)
{
    var property = (PropertyInfo) member;
    ...
}

答案 1 :(得分:0)

您可以尝试:

var isPublic = memberInfo.MemberType switch
{
  MemberTypes.Field => ((FieldInfo)memberInfo).IsPublic,
  MemberTypes.Property => ((PropertyInfo)memberInfo).GetAccessors().Any(MethodInfo => MethodInfo.IsPublic),
  _ => false
};

对于属性,如果有任何公共访问器,则返回true,我认为这是您追求的目标