Использование отражения для установки свойства свойства объекта - PullRequest
5 голосов
/ 10 сентября 2009

У меня есть два класса.

public class Class1 {
   public string value {get;set;}
}

public class Class2 {
   public Class1 myClass1Object {get;set;}
}

У меня есть объект типа Class2. Мне нужно использовать отражение на Class2, чтобы установить свойство value ... то есть, если бы я делал это без отражения, я бы так и поступил:

Class2 myObject = new Class2();
myObject.myClass1Object.value = "some value";

Есть ли способ сделать это, используя отражение для доступа к свойству "myClass1Object.value"?

Заранее спасибо.

Ответы [ 3 ]

11 голосов
/ 10 сентября 2009

В основном разделить его на два доступа к свойствам. Сначала вы получаете свойство 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);
}

По общему признанию, вы, вероятно, захотите немного больше проверки ошибок, чем это:)

1 голос
/ 28 марта 2016

Я искал ответы на случай, когда Получить значение свойства, когда дано имя свойства, но уровень вложенности свойства неизвестен.

Например. если входное значение равно «value» вместо предоставления полного имени свойства, такого как «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;
}
0 голосов
/ 27 июня 2019
   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;
    }
...