Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's wrong with this reflection code? GetFields() is returning an empty array

C#, Net 2.0

Here's the code (I took out all my domain-specific stuff, and it still returns an empty 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; }         }      } } 
like image 825
Chris McCall Avatar asked Jun 24 '09 20:06

Chris McCall


2 Answers

The parameterless GetFields() returns public fields. If you want non-public ones, use:

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

or whatever appropriate combination you want - but you do need to specify at least one of Instance and Static, otherwise it won't find either. You can specify both, and indeed public fields as well, to get everything:

cc.GetType().GetFields(BindingFlags.Instance |                         BindingFlags.Static |                        BindingFlags.NonPublic |                        BindingFlags.Public); 
like image 184
Jon Skeet Avatar answered Oct 07 '22 09:10

Jon Skeet


Since the field is private, you need to use the overload of GetFields() that allows you to specify BindingFlags.NonPublic.

To make this work, change it to:

FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
like image 35
Reed Copsey Avatar answered Oct 07 '22 10:10

Reed Copsey