我有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,但不知道下一步是什么。
谢谢你, 斯蒂芬
答案 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);
}