Определить тип модификатора доступа для свойства с помощью Reflection - PullRequest
18 голосов
/ 11 марта 2010

Я написал некоторый код для просмотра свойств с помощью отражения. Я получил список свойств из класса, используя отражение.

Однако мне нужно выяснить, является ли собственность общедоступной или защищенной. например:

public string Name{get;set;}
protected  int Age{get;set;}

Класс PropertyInfo, по-видимому, не предоставляет эту информацию о свойстве. Есть ли другой способ сделать это?

Ответы [ 4 ]

26 голосов
/ 11 марта 2010

Поскольку свойства являются просто синтаксическим сахаром над парой get / set методов, не существует такого понятия, как «доступность» свойства с точки зрения отражения. Скорее, вам придется выяснять уровни доступности методов get и set отдельно. Для этого извлеките подходящие MethodInfo объекты с помощью методов GetGetMethod и GetSetMethod, а также из различных IsPrivate, IsPublic и других методов и свойств.

9 голосов
/ 11 марта 2010

Вам нужно взглянуть на methodInfo каждого метода get & set например:

PropertyInfo pi = ...;
bool isPublic = pi.GetGetMethod(true).IsPublic;
bool isProtected= pi.GetGetMethod(true).IsFamily;

Кажется, это свойство IsFamily, которое указывает, защищен ли метод ..

5 голосов
/ 28 декабря 2013

Написал метод расширения для этого:

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");
    }
}
public enum AccessModifier
{
    Private,
    Protected,
    Internal,
    Public
}
0 голосов
/ 04 декабря 2013
    static void Main()
    {
        sample obj = new sample();
        Type t = obj.GetType();
        MethodInfo[] m = t.GetMethods();
        Console.WriteLine("Method Information:-\n\n");
        foreach (MethodInfo m1 in m)
            Console.WriteLine("Mthod name:" + m1.Name + "  \nMethod return type:" + m1.ReturnType + "\nIs staic:" + m1.IsStatic + "\nIs Public:" + m1.IsPublic + "\nIs Private:" + m1.IsPrivate);
        FieldInfo[] f = t.GetFields();
        Console.WriteLine("\n\nField Information:-\n\n");
        foreach(FieldInfo f1 in f)
            Console.WriteLine("Field name:" + f1.Name + "  \nField type:" + f1.FieldType + "\nIs staic:" + f1.IsStatic);
        Console.Read();
    }
...