属性上的反射和访问修饰符

Mic*_*rds 18 c# reflection properties access-modifiers

我已经编写了一些代码来使用反射来查看属性.我使用反射从类中检索了一个属性列表.

但是我需要找出该物业是公共的还是受保护的.例如:

public string Name{get;set;}
protected  int Age{get;set;}
Run Code Online (Sandbox Code Playgroud)

PropertyInfo类似乎不公开有关该属性的此信息.还有另一种方法吗?

Ant*_*lev 26

由于属性只是一对get/ set方法的语法糖,所以没有反射性的属性的"可访问性".相反,您必须分别找出可访问级别getset方法.为此,获取适当的MethodInfo使用对象GetGetMethodGetSetMethod方法,并从有各种IsPrivate,IsPublic以及其他的方法和属性.


Ric*_*end 9

您需要查看每个get&set方法的methodInfo,例如:

PropertyInfo pi = ...;
bool isPublic = pi.GetGetMethod(true).IsPublic;
bool isProtected= pi.GetGetMethod(true).IsFamily;
Run Code Online (Sandbox Code Playgroud)

它似乎是IsFamily属性,指示方法是否受到保护.


Joh*_*son 6

为此编写了扩展方法:

public static class ReflectionExt
{
    public static readonly List<AccessModifier> AccessModifiers = new List<AccessModifier>
    {
        AccessModifier.Private, 
        AccessModifier.Protected, 
        AccessModifier.ProtectedInternal,
        AccessModifier.Internal,  
        AccessModifier.Public
    };

    public static AccessModifier Accessmodifier(this PropertyInfo propertyInfo)
    {
        if (propertyInfo.SetMethod == null)
            return propertyInfo.GetMethod.Accessmodifier();
        if (propertyInfo.GetMethod == null)
            return propertyInfo.SetMethod.Accessmodifier();
        var max = Math.Max(AccessModifiers.IndexOf(propertyInfo.GetMethod.Accessmodifier()),
            AccessModifiers.IndexOf(propertyInfo.SetMethod.Accessmodifier()));
        return AccessModifiers[max];
    }

    public static AccessModifier Accessmodifier(this MethodInfo methodInfo)
    {
        if (methodInfo.IsPrivate)
            return AccessModifier.Private;
        if (methodInfo.IsFamily)
            return AccessModifier.Protected;
        if (methodInfo.IsFamilyOrAssembly)
            return AccessModifier.ProtectedInternal;
        if (methodInfo.IsAssembly)
            return AccessModifier.Internal;
        if (methodInfo.IsPublic)
            return AccessModifier.Public;
        throw new ArgumentException("Did not find access modifier", "methodInfo");
    }
}
Run Code Online (Sandbox Code Playgroud)
public enum AccessModifier
{
    Private,
    Protected,
    Internal,
    Public
}
Run Code Online (Sandbox Code Playgroud)