Что не так с этим кодом отражения? GetFields() возвращает пустой массив
С#, Net 2.0
Здесь код (я достал все свои данные, относящиеся к домену, и он по-прежнему возвращает пустой массив):
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; }
}
}
}
Ответы
Ответ 1
Без параметров GetFields()
возвращает общедоступные поля. Если вы хотите непубличные, используйте:
cc.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
или любую подходящую комбинацию, которую вы хотите - но вам нужно указать хотя бы один из Instance
и Static
, иначе он не найдет. Вы можете указать как и все общедоступные поля, чтобы получить все:
cc.GetType().GetFields(BindingFlags.Instance |
BindingFlags.Static |
BindingFlags.NonPublic |
BindingFlags.Public);
Ответ 2
Поскольку поле является приватным, вам нужно использовать перегрузку GetFields(), которая позволяет вам указать BindingFlags.NonPublic.
Чтобы сделать эту работу, измените ее на:
FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
Ответ 3
Вам нужно указать, что вы хотите, чтобы частные (NonPublic) поля
Изменить на:
FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);