Cosa c'è di sbagliato in questo codice di riflessione? GetFields () restituisce un array vuoto
-
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; }
}
}
}
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