¿Qué tiene de malo este código de reflexión? GetFields () está devolviendo una matriz vacía
-
22-07-2019 - |
Pregunta
C #, Net 2.0
Aquí está el código (saqué todas mis cosas específicas del dominio, y todavía devuelve una matriz vacía):
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ChildClass cc = new ChildClass();
cc.OtherProperty = 1;
FieldInfo[] fi = cc.GetType().GetFields();
Console.WriteLine(fi.Length);
Console.ReadLine();
}
}
class BaseClass<T>
{
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
}
class ChildClass : BaseClass<ChildClass>
{
private int myVar;
public int OtherProperty
{
get { return myVar; }
set { myVar = value; }
}
}
}
Solución
El GetFields ()
sin parámetros devuelve campos públicos . Si desea no públicos, use:
cc.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
o cualquier combinación apropiada que desee, pero sí necesita especificar al menos una de Instancia
y Estática
, de lo contrario no lo hará encontrar cualquiera. Puede especificar ambos, y de hecho los campos públicos, para obtener todo:
cc.GetType().GetFields(BindingFlags.Instance |
BindingFlags.Static |
BindingFlags.NonPublic |
BindingFlags.Public);
Otros consejos
Dado que el campo es privado, debe usar la sobrecarga de GetFields () que le permite especificar BindingFlags.NonPublic .
Para que esto funcione, cámbielo a:
FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
Debe especificar que desea los campos privados (no públicos)
Cambiar a:
FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow