22 Stimmen

Erkennung des Zugriffsmodifikatortyps für eine Eigenschaft mithilfe von Reflection

Ich habe einen Code geschrieben, um Eigenschaften mithilfe von Reflexion zu betrachten. Ich habe eine Liste von Eigenschaften aus der Klasse mit Reflection abgerufen.

Ich muss jedoch herausfinden, ob das Grundstück öffentlich oder geschützt ist:

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

Die PropertyInfo-Klasse scheint diese Informationen über die Eigenschaft nicht preiszugeben. Gibt es eine andere Möglichkeit, dies zu tun?

29voto

Anton Gogolev Punkte 109749

Da Eigenschaften nur ein syntaktischer Zucker für ein Paar von get / set Methoden gibt es so etwas wie die "Zugänglichkeit" einer Eigenschaft im Sinne der Reflexion nicht. Vielmehr müssen Sie die Zugänglichkeitsstufen von get y set Methoden getrennt. Rufen Sie zu diesem Zweck geeignete MethodInfo Objekte mit GetGetMethod y GetSetMethod Methoden, und daraus ergeben sich verschiedene IsPrivate , IsPublic und andere Methoden und Eigenschaften.

11voto

Richard Friend Punkte 15340

Sie müssen sich die methodInfo der einzelnen get- und set-Methoden ansehen z.B.:

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

Es scheint die Eigenschaft IsFamily zu sein, die angibt, ob eine Methode geschützt ist

9voto

Johan Larsson Punkte 16314

Schrieb eine Erweiterungsmethode für diese Aufgabe:

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
}

0voto

Rajitha Punkte 1
    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();
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X