Использование отражения для установки свойства свойства объекта
-
05-07-2019 - |
Вопрос
У меня есть два класса.
public class Class1 {
public string value {get;set;}
}
public class Class2 {
public Class1 myClass1Object {get;set;}
}
У меня есть объект типа Class2.Мне нужно использовать отражение в классе 2, чтобы установить свойство значения...то есть, если бы я делал это без размышлений, я бы поступил так:
Class2 myObject = new Class2();
myObject.myClass1Object.value = "some value";
Есть ли способ сделать вышеизложенное, используя отражение для доступа к свойству «myClass1Object.value»?
Заранее спасибо.
Решение
По сути, разделить его на два доступа к свойствам. Сначала вы получаете свойство myClass1Object
, а затем устанавливаете свойство value
для результата.
Очевидно, что вам нужно взять любой формат, в котором у вас есть имя свойства, и разделить его - например, по точкам. Например, это должно иметь произвольную глубину свойств:
public void SetProperty(object source, string property, object target)
{
string[] bits = property.Split('.');
for (int i=0; i < bits.Length - 1; i++)
{
PropertyInfo prop = source.GetType().GetProperty(bits[i]);
source = prop.GetValue(source, null);
}
PropertyInfo propertyToSet = source.GetType()
.GetProperty(bits[bits.Length-1]);
propertyToSet.SetValue(source, target, null);
}
По общему признанию, вы, вероятно, захотите немного больше проверки ошибок, чем это:)
Другие советы
Я искал ответы на случай, когда можно получить значение свойства, когда указано имя свойства, но уровень вложенности свойства неизвестен.
Например.если входные данные — «значение», а не полное имя свойства, например «myClass1Object.value».
Ваши ответы вдохновили мое рекурсивное решение ниже:
public static object GetPropertyValue(object source, string property)
{
PropertyInfo prop = source.GetType().GetProperty(property);
if(prop == null)
{
foreach(PropertyInfo propertyMember in source.GetType().GetProperties())
{
object newSource = propertyMember.GetValue(source, null);
return GetPropertyValue(newSource, property);
}
}
else
{
return prop.GetValue(source,null);
}
return null;
}
public static object GetNestedPropertyValue(object source, string property)
{
PropertyInfo prop = null;
string[] props = property.Split('.');
for (int i = 0; i < props.Length; i++)
{
prop = source.GetType().GetProperty(props[i]);
source = prop.GetValue(source, null);
}
return source;
}