O que há de errado com este código de reflexão? GetFields () está a devolver uma matriz vazia
-
22-07-2019 - |
Pergunta
C #, Net 2.0
Aqui está o código (eu tirei todas as minhas coisas de domínio específico, e ainda retorna uma matriz vazia):
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; }
}
}
}
Solução
Os parâmetros GetFields()
retornos públicas campos. Se você quer os não-públicas, use:
cc.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
ou qualquer combinação apropriada que você quiser - mas você do necessidade de especificar pelo menos um dos Instance
e Static
, caso contrário ele não vai encontrar qualquer um. Você pode especificar ambos, e certamente campos públicos, bem como, para ter tudo:
cc.GetType().GetFields(BindingFlags.Instance |
BindingFlags.Static |
BindingFlags.NonPublic |
BindingFlags.Public);
Outras dicas
Como o campo é privado, você precisa usar a sobrecarga de GetFields () que permite que você especifique BindingFlags.NonPublic .
Para fazer este trabalho, alterá-lo para:
FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
Você precisa especificar que deseja que os campos privados (não pública)
Change to:
FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);