我寫了一些代碼來查看使用反射的屬性。我使用反射從類中檢索了一個屬性列表。屬性上的反射和訪問修飾符
但是,我需要找出屬性是公共的還是保護的。例如:
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
方法的可訪問性級別。爲此,用GetGetMethod
和GetSetMethod
方法檢索適當的對象,並從中有各種IsPrivate
,IsPublic
和其他方法和屬性。
你需要看各的MethodInfo得到&一套方法 如:
PropertyInfo pi = ...;
bool isPublic = pi.GetGetMethod(true).IsPublic;
bool isProtected= pi.GetGetMethod(true).IsFamily;
這似乎是IsFamily屬性,表明如果一個方法是受保護..
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();
}
爲此寫了一個擴展方法:
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
}
你打我吧... – 2010-03-11 15:27:50