Was ist falsch mit dieser Reflexion Code? GetFields () zurückkehrt, ein leeres Array
-
22-07-2019 - |
Frage
C # Net 2.0
Hier ist der Code (Ich habe all meine domänenspezifischen Sachen, und es gibt immer noch ein leeres Array):
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; }
}
}
}
Lösung
Die parameterlos GetFields()
kehrt öffentliche Felder aus. Wenn Sie nicht-öffentlich diejenigen mögen, verwenden Sie:
cc.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
oder was auch immer geeignete Kombination Sie wollen - aber Sie tun müssen mindestens eine der Instance
und Static
angeben, sonst wird es auch nicht finden. Sie können beide angeben, und in der Tat öffentliche Bereiche als auch, alles zu bekommen:
cc.GetType().GetFields(BindingFlags.Instance |
BindingFlags.Static |
BindingFlags.NonPublic |
BindingFlags.Public);
Andere Tipps
Da das Feld privat ist, müssen Sie die Überlastung von GetFields () verwenden, die Sie BindingFlags.NonPublic .
Um diese Arbeit zu machen, ändern Sie es an:
FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
Sie müssen angeben, dass Sie die privaten (NonPublic) Felder
wollenWechsel zu:
FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);