关于如何遍历类的所有属性,有各种非常棒的信息。但是,我想要做的是迭代它们并在构造函数中将每个属性实例化为new ...该类是一个聚合类,表示实体框架模型对象/类的集合。我可以依次实例化每个,但是当我决定将另一个表添加到数据库时,这将是巨大的并且是维护问题......
public class ClsAggModel {
public ClsAggModel() {
foreach (PropertyInfo props in this.GetType().GetProperties()) {
props.SetValue = new props.GetType(); //problem here!
}
}
public clsItem1 pProp1{ get; set; }
public clsItem2 pProp2{ get; set; }
//...and so on
问题是编译器似乎不知道此时props
是什么:
类型或命名空间名称'道具'无法找到(你错过了吗? using指令或程序集引用?)
这似乎很奇怪,因为我只是在循环签名中对其进行了实例化。我可以填写每个属性并执行私有变量和所有爵士乐,但如果你不能滥用它,反思有什么好处呢?
任何提示?
答案 0 :(得分:0)
假设您要调用默认创建类型,请使用此类激活器
props.SetValue(this, Activator.CreateInstance(props.GetType()));
注意,如果没有默认构造函数,这仍然会失败。因为您正在使用反射,所以编译器无法再检查此内容。
注2:滥用反射要小心改变。这是一个确定的方法,迟早会在脚下射击自己。
更新当然setvalue是一种方法,改变了这个
答案 1 :(得分:0)
您无法以此方式在.GetType()
的基础上创建实例。
这不起作用:
new props.GetType();
你应该尝试使用:
Activator.CreateInstance(props.GetType());
答案 2 :(得分:0)
根据已提供的解决方案,您的代码应如下所示:
public class ClsAggModel {
public ClsAggModel() {
foreach (PropertyInfo prop in this.GetType().GetProperties()) {
var newValue = Activator.CreateInstance(prop.GetType());
prop.SetValue(this, newValue);
}
}
public clsItem1 pProp1{ get; set; }
public clsItem2 pProp2{ get; set; }
请记住,所有属性类型都必须允许动态创建,方法是提供默认构造函数(如果未定义其他构造函数,则自动生成)。