Cosa c'è di sbagliato in questo codice di riflessione? GetFields () restituisce un array vuoto

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

  •  22-07-2019
  •  | 
  •  

Domanda

C #, Net 2.0

Ecco il codice (ho eliminato tutte le mie cose specifiche del dominio e restituisce ancora un array vuoto):

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

    }
}
È stato utile?

Soluzione

Il GetFields () senza parametri restituisce i campi pubblici . Se vuoi quelli non pubblici, usa:

cc.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);

o qualsiasi combinazione appropriata tu voglia - ma fai devi specificare almeno uno tra Instance e Static , altrimenti non trova neanche. Puoi specificare sia, sia anche i campi pubblici, per ottenere tutto:

cc.GetType().GetFields(BindingFlags.Instance | 
                       BindingFlags.Static |
                       BindingFlags.NonPublic |
                       BindingFlags.Public);

Altri suggerimenti

Poiché il campo è privato, è necessario utilizzare il sovraccarico di GetFields () che consente di specificare BindingFlags.NonPublic .

Per farlo funzionare, modificalo in:

FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

Devi specificare che vuoi i campi privati ??(non pubblici)

Cambia in:

FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top