リフレクションを使用してプロパティを確認するコードをいくつか書きました。リフレクションを使用して、クラスからプロパティのリストを取得しました。
ただし、プロパティが公開されているか保護されているかを確認する必要があります。例えば:
public string Name{get;set;}
protected int Age{get;set;}
PropertyInfo クラスは、プロパティに関するこの情報を公開していないようです。これを行う別の方法はありますか?
リフレクションを使用してプロパティを確認するコードをいくつか書きました。リフレクションを使用して、クラスからプロパティのリストを取得しました。
ただし、プロパティが公開されているか保護されているかを確認する必要があります。例えば:
public string Name{get;set;}
protected int Age{get;set;}
PropertyInfo クラスは、プロパティに関するこの情報を公開していないようです。これを行う別の方法はありますか?
get
プロパティは/メソッドのペアに対するシンタックス シュガーにすぎset
ないため、リフレクションに関するプロパティの「アクセシビリティ」などはありません。get
むしろ、とset
メソッドのアクセシビリティ レベルを個別に調べる必要があります。そのために、およびメソッドを使用して適切なMethodInfo
オブジェクトを取得し、そこからさまざまなおよびその他のメソッドとプロパティを取得します。GetGetMethod
GetSetMethod
IsPrivate
IsPublic
各 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<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
}