what - type.gettype c#
C#: Acceso a miembros de instancias privadas heredadas a través de la reflexión (4)
Soy un principiante absoluto en la reflexión en C #. Quiero usar la reflexión para acceder a todos los campos privados de una clase, incluidos los heredados.
He tenido éxito en acceder a todos los campos privados excluyendo aquellos que son heredados, así como a todos los campos heredados públicos y protegidos. Sin embargo, no he podido acceder a los campos privados heredados. El siguiente ejemplo ilustra:
class A
{
private string a;
public string c;
protected string d;
}
class B : A
{
private string b;
}
class test
{
public static void Main(string[] Args)
{
B b = new B();
Type t;
t = b.GetType();
FieldInfo[] fields = t.GetFields(BindingFlags.Public | BindingFlags.NonPublic
| BindingFlags.Instance);
foreach(FieldInfo fi in fields){
Console.WriteLine(fi.Name);
}
Console.ReadLine();
}
}
Esto falla al encontrar el campo Ba
¿Es incluso posible lograr esto? La solución obvia sería convertir los campos privados heredados en campos protegidos. Esto, sin embargo, está fuera de mi control en este momento.
Como dijo Lee, puedes hacer esto con recursión.
private static void FindFields(ICollection<FieldInfo> fields, Type t) {
var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
foreach (var field in t.GetFields(flags)) {
// Ignore inherited fields.
if (field.DeclaringType == t)
fields.Add(field);
}
var baseType = t.BaseType;
if (baseType != null)
FindFields(fields, baseType);
}
public static void Main() {
var fields = new Collection<FieldInfo>();
FindFields(fields, typeof(B));
foreach (FieldInfo fi in fields)
Console.WriteLine(fi.DeclaringType.Name + " - " + fi.Name);
}
No lo he probado, pero debería poder acceder a los miembros privados de tipo base a través de la propiedad Type.BaseType y acumular recursivamente todos los campos privados a través de la jerarquía de herencia.
No puede acceder a los campos privados de A
usando el tipo de B
porque esos campos no existen en B
, solo existen en A
Debe especificar el tipo de A
directamente o recuperarlo por otros medios (como obtener la clase base del tipo B
).
Puede acceder a miembros privados de Clase A desde Clase B con ''Clases anidadas''. Usted hace Clase A como Clase Externa y Clase B como Clase Interna
Class A
{
...
Class B
{
.......
}
}