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