Quel est le problème avec ce code de réflexion? GetFields () renvoie un tableau vide
-
22-07-2019 - |
Question
C #, Net 2.0
Voici le code (j'ai sorti tout mon contenu spécifique à un domaine et il renvoie toujours un tableau vide):
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; }
}
}
}
La solution
Le GetFields ()
sans paramètre renvoie des champs publics . Si vous souhaitez des sites non publics, utilisez:
cc.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
ou quelle que soit la combinaison appropriée de votre choix - mais vous devez spécifier au moins un des éléments Instance
et Static
, sinon ce ne sera pas le cas. trouver non plus. Vous pouvez spécifier les deux, et même les champs publics, pour tout obtenir:
cc.GetType().GetFields(BindingFlags.Instance |
BindingFlags.Static |
BindingFlags.NonPublic |
BindingFlags.Public);
Autres conseils
Le champ étant privé, vous devez utiliser la surcharge de GetFields () qui vous permet de spécifier BindingFlags.NonPublic .
Pour que cela fonctionne, remplacez-le par:
FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
Vous devez spécifier que vous souhaitez que les champs privés (non publics)
Changer en:
FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);