代码之家  ›  专栏  ›  技术社区  ›  Michael Edwards

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

  •  16
  • Michael Edwards  · 技术社区  · 16 年前

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

    不过,我需要知道这些财产是公共的还是受保护的。如:

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

    propertyinfo类似乎没有公开有关该属性的此信息。还有别的办法吗?

    4 回复  |  直到 9 年前
        1
  •  25
  •   Anton Gogolev    16 年前

    因为属性只是一对 get / set 方法,不存在属性反射的“可访问性”。相反,您必须找出 得到 设置 方法分开。为此,检索适当的 MethodInfo 对象与 GetGetMethod GetSetMethod 方法,从那里有各种 IsPrivate , IsPublic 以及其他方法和特性。

        2
  •  9
  •   NightOwl888 Jabrwoky    9 年前

    您需要查看每个get&set方法的methodinfo 如:

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

    似乎是isfamily属性指示方法是否受保护。

        3
  •  4
  •   Johan Larsson    12 年前

    为此编写了扩展方法:

    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
    }
    
        4
  •  0
  •   Rajitha    12 年前
        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();
        }