SetValue в отраженной ProperyInfo

Я использую отражение, чтобы установить свойство из отраженного свойства. Я должен использовать отражение, так как я не знаю, какого типа будет дочернее свойство, но каждый раз, когда я получаю System.Target.TargetException (в prop.SetValue), prop указывает на правильное свойство

Я могу найти много примеров SetValue, проблема, с которой я сталкиваюсь, связана, как я ожидаю, с тем фактом, что selectSubProcess является PropertyInfo, а не фактическим классом.

PropertyInfo selectedSubProcess = process.GetProperty(e.ChangedItem.Parent.Label);
Type subType = selectedSubProcess.PropertyType;
PropertyInfo prop = subType.GetProperty(e.ChangedItem.Label + "Specified");
if (prop != null)
        {
            prop.SetValue(process, true, null);
        }

person spacemonkeys    schedule 03.10.2013    source источник


Ответы (1)


Похоже, процесс - это «Тип», а не экземпляр объекта. в линии

prop.SetValue(process, true, null);

вам нужен экземпляр объекта для установки, а не тип.

Используйте «GetValue», чтобы получить экземпляр интересующего вас объекта:

public void test()
{
  A originalProcess = new A();
  originalProcess.subProcess.someBoolean = false;

  Type originalProcessType = originalProcess.GetType();
  PropertyInfo selectedSubProcess = originalProcessType.GetProperty("subProcess");
  object subProcess = selectedSubProcess.GetValue(originalProcess, null);
  Type subType = selectedSubProcess.PropertyType;
  PropertyInfo prop = subType.GetProperty("someBoolean");
  if (prop != null)
  {
    prop.SetValue(subProcess, true, null);
  }

  MessageBox.Show(originalProcess.subProcess.someBoolean.ToString());
}


public class A
{
  private B pSubProcess = new B();
  public B subProcess
  {
    get
    {
      return pSubProcess;
    }
    set
    {
      pSubProcess = value;
    }
  }

}

public class B
{
  private bool pSomeBoolean = false;
  public bool someBoolean
  {
    get
    {
      return pSomeBoolean;
    }
    set
    {
      pSomeBoolean = true;
    }
  }
}
person MikeH    schedule 03.10.2013
comment
Имея небольшие проблемы с преобразованием вашего кода, мои GetValue и SetValue требуют дополнительного параметра, и когда я получаю их в Null... я получаю ту же ошибку, что и раньше - person spacemonkeys; 03.10.2013
comment
Какую версию .Net вы используете? - person MikeH; 03.10.2013
comment
Код был обновлен до .Net 2.0, хотя единственным изменением является добавление нулевых аргументов, что, похоже, вы уже сделали. Можете ли вы заставить мой код работать как есть (т.е. пока не пытайтесь преобразовать его в свою структуру)? - person MikeH; 03.10.2013
comment
Кроме того, убедитесь, что при установке значения SetValue вы передаете экземпляр родителя логического значения, а не экземпляр самого логического значения. Информация о том, какое свойство установить в родительском элементе, предоставляется свойством PropertyInfo. - person MikeH; 03.10.2013