属性上的reflection和访问修饰符

我编写了一些代码来查看使用reflection的属性。 我使用reflection从类中检索了一个属性列表。

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

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

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

由于属性只是一对get / set方法的语法糖,所以没有reflection方式的属性“可访问性”。 相反,您必须分别找出getset方法的可访问级别。 为此,使用GetGetMethodGetSetMethod方法检索适当的MethodInfo对象,并且从中有各种IsPrivateIsPublic和其他方法和属性。

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

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

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

为此写了一个扩展方法:

 public static class ReflectionExt { public static readonly List AccessModifiers = new List { 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 } 
  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(); }