Чтобы сделать то, что вы просите, вам нужно использовать рефлексию (как вы отметили свой вопрос), чтобы сделать это. Взгляните на класс PropertyInfo
. Я не совсем уверен, что делает ваш код, но общий пример рефлективной установки значения свойства будет:
object targetInstance = ...; // your target instance
PropertyInfo prop = targetInstance.GetType().GetProperty(propertyName);
prop.SetValue(targetInstance, null, newValue);
Однако вы могли бы вместо этого передать Action<T>
, если вы знаете свойство в какой-то момент кода. Например:
YourType targetInstance = ...;
Action<PropertyType> prop = value => targetInstance.PropertyName = value;
... // in your consuming code
prop(newValue);
Или, если вы знаете тип при вызове, но у вас нет экземпляра, вы можете сделать его Action<YourType, PropertyType>
. Это также предотвратит создание замыкания.
Action<YourType, PropertyType> prop = (instance, value) => instance.PropertyName = value;
... // in your consuming code
prop(instance, newValue);
Чтобы сделать это полностью универсальным («универсальным», как в «неспецифическом», а не как в универсальном), вам, вероятно, придется сделать его Action<object>
и привести его к соответствующему типу свойства в лямбде, но это должно работать в любом случае.