2010-03-11 7 views
15

Napisałem kod, aby przyjrzeć się właściwościom za pomocą refleksji. Pobrałem listę właściwości z klasy za pomocą refleksji.Modyfikatory odbicia i dostępu do właściwości

Muszę się jednak dowiedzieć, czy nieruchomość jest publiczna, czy chroniona. np .:

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

Klasa PropertyInfo nie wydaje się ujawniać tej informacji o nieruchomości. Czy jest inny sposób na zrobienie tego?

Odpowiedz

22

Ponieważ właściwości są po prostu syntaktycznym cukrem w stosunku do pary metod, nie ma czegoś takiego jak "dostępność" własności w zakresie odbicia. Zamiast tego musisz osobno sprawdzić poziomy dostępności dla metod get i set. W tym celu pobierz odpowiednie obiekty MethodInfo metodami GetGetMethod i GetSetMethod, a następnie różne IsPrivate, IsPublic i inne metody i właściwości.

+0

pokonałeś mnie ... –

9

Trzeba spojrzeć na MethodInfo każdego dostać & zestaw metoda np

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

Wydaje się, że właściwość IsFamily wskazującą, czy metoda jest chroniony ..

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

Napisano metodę przedłużenia tego:

public static class ReflectionExt 
{ 
    public static readonly List<AccessModifier> AccessModifiers = new List<AccessModifier> 
    { 
     AccessModifier.Private, 
     AccessModifier.Protected, 
     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.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 
} 
Powiązane problemy