2009-06-24 2 views
15

C#, Net 2.0Что случилось с этим кодом отражения? GetFields() возвращает пустой массив

Вот код (я вынул все свои предметно-конкретные вещи, и она по-прежнему возвращает пустой массив):

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

    } 
} 

ответ

53

без параметров GetFields() возвращается общественных полей. Если вы хотите, не казенные, использование:

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

или любые соответствующие комбинации вы хотите - но вы сделать необходимость указать по крайней мере один из Instance и Static, в противном случае он не найдет ни. Вы можете указать и то, и другое, как и все поля, чтобы получить все:

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

+1 Это тот, который вы должны указать Instance, а также NonPublic. –

+1

Приветствия за ответ! Однако у меня проблемы с пониманием. Может кто-нибудь объяснить, почему Instance или Static требуется вместе с NonPublic для частных полей? – Zack

+0

@ rory.ap: Да, точно. –

10

Поскольку поле является приватным, вам нужно использовать перегрузку GetFields(), которая позволяет указать BindingFlags.NonPublic.

Чтобы сделать эту работу, изменить его на:

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

Вы должны указать, что вы хотите, частные (непубличной) полей

Изменить на:

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

Это также вернет 0 элементов. Вам нужно включить BindingFlags.Instance в дополнение к BindingFlags.NonPublic. –

Смежные вопросы