迭代聚合类的所有属性并实例化?

时间:2015-12-19 18:45:16

标签: c#

关于如何遍历类的所有属性,有各种非常棒的信息。但是,我想要做的是迭代它们并在构造函数中将每个属性实例化为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指令或程序集引用?)

这似乎很奇怪,因为我只是在循环签名中对其进行了实例化。我可以填写每个属性并执行私有变量和所有爵士乐,但如果你不能滥用它,反思有什么好处呢?

任何提示?

3 个答案:

答案 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; }

请记住,所有属性类型都必须允许动态创建,方法是提供默认构造函数(如果未定义其他构造函数,则自动生成)。