Как я могу достичь «объекта» за свойством с отражением? - PullRequest
1 голос
/ 25 августа 2011

Есть ли способ получить объект за свойством по отражению?

Я пытаюсь управлять динамической настройкой свойства.

Пример:

class Animal
{
  public string Name {get;set;}
  public string Family {get;set;}
}

class Zoo
{
 public Animal Lion {get;set;}
 public Animal Panda {get;set;}
}


class Test
{
   public void SetLionNameWithReflection()
  {

    Zoo londonZoo = new Zoo();
    Type zooType = typeof(Zoo);
    PropertyInfo lionProperty = zooType.GetProperty("Lion");

    // Now what to write here so that I can manage to set Lion's name to Kaspar?
    // (to manage this by reflection Lion.Name = "Kaspar");

  }

}

Какие строки я должен добавить больше в прокомментированной части выше?

Спасибо!

Ответы [ 5 ]

4 голосов
/ 25 августа 2011

Я не думаю, что вам на самом деле нужно знать объект за свойством.Используйте метод SetValue , чтобы установить его значение в «Kaspar»:

EDIT - согласно комментарию dlev, вот как это должно выглядеть:

Lion kaspar = new Lion { Name="Kaspar" };
zooType.SetValue(londonZoo, kaspar, null);
2 голосов
/ 25 августа 2011

Свойство не обязательно должно иметь объект «позади».

Оно определяется 2 функциями, get и set, которые могут делать все, что вы хотите, и не обязательно возвращать объектзначение вообще.

То, что вы использовали, является просто синтаксическим сахаром, чтобы упростить создание свойства для переноса элемента.

1 голос
/ 25 августа 2011

Сначала нужно создать льва:

var lion = Activator.CreateInstance(lionProperty.PropertyType);

Тогда вам нужно установить свойство Lion в зоопарке:

lionProperty.SetValue(londonZoo, lion, null);

Тогда вы можете получить свойство Name льва:

PropertyInfo property = lion.GetType().GetProperty("Name", 
    BindingFlags.Public | BindingFlags.Instance);

Тогда вы можете установить его имя:

if (property != null && property.CanWrite)
{
    property.SetValue(lion, "Kaspar", null);
}
1 голос
/ 25 августа 2011

Можете ли вы добавить перегруженный конструктор к вашему животному объекту, который позволит вам передать имя животного, например, так:

londonZoo.GetProperty("Lion").SetValue(londonZoo, new Lion("Kaspar"), null); 
1 голос
/ 25 августа 2011

Нет, вы не можете использовать отражение, чтобы окончательно получить объект за произвольным свойством.Во многом потому, что не гарантируется, что каждое свойство связано с объектом.С таким же успехом это может быть вычисленное значение.

public class Student {
  public string m_firstName;
  public string m_lastName;

  public string FullName {
    get { return String.Format("{0} {1}", m_firstName, m_lastName); }
  }
}

В этом случае свойство FullName создает вычисленное значение и не имеет единственного объекта поддержки.

Случай, который вы перечисляете, хотя и для авто-свойств.Вероятно, есть способ копаться в полях и использовать форму сопоставления имен, чтобы получить тот, который поддерживает данное авто-свойство.Однако такое решение было бы хрупким для управления версиями и, конечно, не рекомендуется.

...