Как создать экземпляр свойств в ctor объекта с помощью Reflection - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть объект POCO MyObject

public class MyModel
{
    public MyProperty MyProperty001 { get; set; }
    public MyProperty MyProperty002 { get; set; }


    MyModel()
    {
        // New up all the public properties
        var properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

        foreach (var propertyInfo in properties)
        {
            //Activator.CreateInstance()
        }
    }
}

, который имеет сотни свойств, возможно ли использовать отражение, чтобы создать их экземпляр в конструкторе? У меня есть PropertyInfo, но я не знаю, каков будет следующий шаг.

Спасибо, Стивен

Ответы [ 4 ]

2 голосов
/ 12 сентября 2011

Тип свойства находится в пределах свойства PropertyType объекта PropertyInfo, поэтому в соответствии с этим вы можете создавать экземпляры своих объектов, вызывая Activator.CreateInstance(propertyInfo.PropertyType). Чем вам нужно установить экземпляр в свойстве объекта-контейнера, вызвав propertyInfo.SetValue(this, instance, null)

Полный образец:

foreach (var propertyInfo in properties) 
{
    var instance = Activator.CreateInstance(propertyInfo.PropertyType);
    propertyInfo.SetValue(this, instance, null);
}
0 голосов
/ 12 сентября 2011

Если вы хотите установить значение свойства для нового экземпляра соответствующего типа свойства, это должно быть возможно следующим образом:

var instance = propertyInfo.PropertyType.GetConstructor(Type.EmptyTypes).Invoke(new object[0]);
propertyInfo.SetValue(this, instance, null);
0 голосов
/ 12 сентября 2011

Если они не являются конструкторами параметров, вы можете сделать

foreach (var propertyInfo in properties) {
    ConstructorInfo ci = propertyInfo.GetType().GetConstructor(new Type[] { propertyInfo.PropertyType() });
     propertyInfo.SetValue(this, ci.Invoke(new object[] { }), null);
 }
0 голосов
/ 12 сентября 2011
public class MyModel
{
    private MyProperty _MyProperty001 = new MyProperty();
    public MyProperty MyProperty001 
    { 
      get { return _myProperty001; } 
      set { _MyProperty001 = value; }
    }
}

Используйте вспомогательное поле, нет необходимости в отражении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...