#c# #reflection #propertyinfo #setvalue
#c# #отражение #propertyinfo #setvalue
Вопрос:
Я столкнулся с очень странной проблемой. Я пытаюсь установить свойство определенного объекта, присвоив ему значение другого проекта через
/* PropertyInfo.SetValue(object obj, object val, object[] index) */
propertyInfo.SetValue(obj, val, null)
оба obj
и val
являются ссылочным типом, но проблема в том, что я хочу, чтобы значение obj's property
менялось при val
изменении значения. Но, к сожалению, этого не происходит.
Есть ли какой-либо способ достичь того, что я хочу сделать.
С уважением
Umair
Комментарии:
1. Что именно вы подразумеваете под «этого не происходит»? Я не вижу очевидных проблем с вашим кодом.
Ответ №1:
Ну, во-первых, если вы хотите, чтобы свойство автоматически изменялось всякий раз, когда вы изменяете содержимое передаваемой вами переменной, то нет, этого не произойдет, вам придется снова вызвать SetValue
или аналогичный код.
С другой стороны, если вы не заменяете экземпляр, а изменяете содержимое экземпляра, то это должно произойти.
Другими словами, это будет работать:
TestClass val = new TestClass();
val.Name = "Before";
propertyInfo.SetValue(obj, val, null);
val.Name = "After";
Вы не создаете копию экземпляра, вы просто предоставляете ссылку на него, поэтому изменение будет наблюдаться как через переменную val
, так и через рассматриваемое свойство.
Однако это не сработает:
TestClass val = new TestClass();
val.Name = "Before";
propertyInfo.SetValue(obj, val, null);
val = new TestClass();
val.Name = "After";
Теперь у вас есть два экземпляра, на один из которых ссылается свойство, а на другой — переменная. Нет способа заставить свойство автоматически получать этот новый экземпляр, поэтому вам нужно найти другой способ сделать это.