Как получить доступ к частному полю базового класса с помощью Reflection - PullRequest
2 голосов
/ 19 декабря 2011

Я пытаюсь установить частное поле "visible" для переменной типа BaseClass.

  • ChildClass
    • BaseClass
      • поле "visible"

Я успешно получил доступ к переменной типа ChildClass и FieldInfo для поля "visible" в BaseClass.

Но когда я пытаюсь установить / получить значение поля, я получаю сообщение об ошибке System.Runtime.Remoting.RemotingException: Remoting не может найти поле 'visible' для типа 'BaseClass'.

Так есть ли способ "привести вниз" переменную типа ChildClass к BaseClass, чтобы отражение работало?


Редактировать: Точный код, который я использую:

// get the varible
PropertyInfo pi = overwin.GetProperty("Subject", BindingFlags.Instance|BindingFlags.Public);
CalcScene scene = (CalcScene) pi.GetValue(inwin, null);

// <<< scene IS ACTUALLY A TYPE OF DisplayScene, WHICH INHERITS FROM CalcScene

// get the 'visible' field
Type calScene = typeof(CalcScene);
FieldInfo calVisible = calScene.GetField("visible",BindingFlags.Instance|BindingFlags.NonPublic);

// set the value
calVisible.SetValue(scene, true); // <<< CANNOT FIND FIELD AT THIS POINT

Точная структура класса:

class CalcScene  
{
    private bool visible;
}

class DisplayScene : CalcScene  
{
}

Ответы [ 2 ]

3 голосов
/ 19 декабря 2011

вы можете попробовать вот так

    class B
    {
        public int MyProperty { get; set; }
    }

    class C : B
    {
        public string MyProperty2 { get; set; }
    }

    static void Main(string[] args)
    {
        PropertyInfo[] info = new C().GetType().GetProperties();
        foreach (PropertyInfo pi in info)
        {
            Console.WriteLine(pi.Name);
        }
    }

производит

    MyProperty2
    MyProperty
1 голос
/ 19 декабря 2011

Вот некоторый код, который демонстрирует разницу между получением поля и свойства:

  public static MemberInfo GetPropertyOrField(this Type type, string propertyOrField)
  {
      MemberInfo member = type.GetProperty(propertyOrField, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
      if (member == null)
          member = type.GetField(propertyOrField, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);

      Debug.Assert(member != null);
      return member;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...