O que há de errado com este código de reflexão? GetFields () está a devolver uma matriz vazia

StackOverflow https://stackoverflow.com/questions/1040803

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

    }
}
Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top