如何使用Reflection实例化对象的ctor中的属性

时间:2011-09-12 19:44:50

标签: c# reflection

我有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 个答案:

答案 0 :(得分:2)

属性类型保存在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);
}

答案 1 :(得分:0)

public class MyModel
{
    private MyProperty _MyProperty001 = new MyProperty();
    public MyProperty MyProperty001 
    { 
      get { return _myProperty001; } 
      set { _MyProperty001 = value; }
    }
}

使用支持字段,无需反射。

答案 2 :(得分:0)

假设您要将属性值设置为相应属性类型的新实例,则可以通过以下方式实现:

var instance = propertyInfo.PropertyType.GetConstructor(Type.EmptyTypes).Invoke(new object[0]);
propertyInfo.SetValue(this, instance, null);

答案 3 :(得分:0)

如果它们不是参数构造函数,则可以执行

foreach (var propertyInfo in properties) {
    ConstructorInfo ci = propertyInfo.GetType().GetConstructor(new Type[] { propertyInfo.PropertyType() });
     propertyInfo.SetValue(this, ci.Invoke(new object[] { }), null);
 }