20

リフレクションを使用してプロパティを確認するコードをいくつか書きました。リフレクションを使用して、クラスからプロパティのリストを取得しました。

ただし、プロパティが公開されているか保護されているかを確認する必要があります。例えば:

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

PropertyInfo クラスは、プロパティに関するこの情報を公開していないようです。これを行う別の方法はありますか?

4

4 に答える 4

27

getプロパティは/メソッドのペアに対するシンタックス シュガーにすぎsetないため、リフレクションに関するプロパティの「アクセシビリティ」などはありません。getむしろ、とsetメソッドのアクセシビリティ レベルを個別に調べる必要があります。そのために、およびメソッドを使用して適切なMethodInfoオブジェクトを取得し、そこからさまざまなおよびその他のメソッドとプロパティを取得します。GetGetMethodGetSetMethodIsPrivateIsPublic

于 2010-03-11T15:25:00.443 に答える
9

各 get & set メソッドの methodInfo を確認する必要があります。例:

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

メソッドが保護されているかどうかを示す IsFamily プロパティのようです。

于 2010-03-11T15:27:25.413 に答える
7

これのための拡張メソッドを書きました:

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
}
于 2013-12-27T20:58:16.920 に答える