functions - public private protected c#
Reflexión y modificadores de acceso en una propiedad. (4)
Dado que las propiedades son solo azúcar sintáctica sobre un par de métodos get
/ set
, no hay tal cosa como la "accesibilidad" de una propiedad en lo que respecta a la reflexión. Más bien, tendrá que averiguar los niveles de accesibilidad de los métodos de get
y set
separado. Con ese fin, recupere los objetos MethodInfo
apropiados con los métodos GetGetMethod
y GetSetMethod
, y de allí hay varios IsPrivate
, IsPublic
y otros métodos y propiedades.
He escrito algo de código para ver las propiedades utilizando la reflexión. He recuperado una lista de propiedades de la clase utilizando la reflexión.
Sin embargo, necesito saber si la propiedad es pública o está protegida. p.ej:
public string Name{get;set;}
protected int Age{get;set;}
La clase PropertyInfo no parece exponer esta información sobre la propiedad. Hay otra manera de hacer esto?
Debe ver la información del método de cada método de obtención y configuración, por ejemplo:
PropertyInfo pi = ...;
bool isPublic = pi.GetGetMethod(true).IsPublic;
bool isProtected= pi.GetGetMethod(true).IsFamily;
Parece ser la propiedad IsFamily que indica si un método está protegido.
Escribió un método de extensión para esto:
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
}
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();
}