Erkennen Sie den Zugriffsmodifikatortyp für eine Eigenschaft mithilfe von Reflektion

Erkennen Sie den Zugriffsmodifikatortyp für eine Eigenschaft mithilfe von Reflektion

Da Eigenschaften nur syntaktischer Zucker über ein Paar get sind /set Methoden gibt es keine "Zugänglichkeit" einer Eigenschaft in Bezug auf die Reflexion. Stattdessen müssen Sie die Zugänglichkeitsstufen von get herausfinden und set Methoden getrennt. Rufen Sie zu diesem Zweck das entsprechende MethodInfo ab Objekte mit GetGetMethod und GetSetMethod Methoden, und von dort gibt es verschiedene IsPrivate , IsPublic und andere Methoden und Eigenschaften.


Sie müssen sich die methodInfo jeder get &set methodeg ansehen:

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..


Habe dafür eine Erweiterungsmethode geschrieben:

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
}