Quel est le problème avec ce code de réflexion? GetFields () renvoie un tableau vide

StackOverflow https://stackoverflow.com/questions/1040803

  •  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; }
        }

    }
}
Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top