Использование отражения для установки свойства свойства объекта

StackOverflow https://stackoverflow.com/questions/1402479

  •  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;
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top