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

C# 迭代聚合类的所有属性并实例化?,c#,C#,关于如何迭代一个类的所有属性,有各种各样非常棒的信息。然而,我想做的是迭代它们,并在构造函数中将每个属性实例化为新的。。。该类是一个聚合类,表示实体框架模型对象/类的集合。我可以依次实例化每个表,但当我决定向数据库中添加另一个表时,这将是一个巨大的问题和维护问题 public class ClsAggModel { public ClsAggModel() { foreach (PropertyInfo props in this.GetType().GetPropert

关于如何迭代一个类的所有属性,有各种各样非常棒的信息。然而,我想做的是迭代它们,并在构造函数中将每个属性实例化为新的。。。该类是一个聚合类,表示实体框架模型对象/类的集合。我可以依次实例化每个表,但当我决定向数据库中添加另一个表时,这将是一个巨大的问题和维护问题

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
是什么:

找不到类型或命名空间名称“props”(是否缺少) 使用指令或组件引用?)

这似乎有点奇怪,因为我刚刚在循环签名中对它进行了标定。我可以填写每个属性并执行私有变量和所有那些jazz,但是如果不能滥用反射,反射又有什么好处呢


有什么提示吗?

假设您想调用默认创建的类型,请像这样使用激活器

props.SetValue(this, Activator.CreateInstance(props.GetType()));
注意,如果没有默认构造函数,此操作仍将失败。因为您使用的是反射,所以编译器无法再对此进行检查

注2:应小心地改变滥用反射。这是迟早会击中你自己脚的一个好办法


更新当然setvalue是一种方法,如果您想调用默认创建的类型,请更改此方法

props.SetValue(this, Activator.CreateInstance(props.GetType()));
注意,如果没有默认构造函数,此操作仍将失败。因为您使用的是反射,所以编译器无法再对此进行检查

注2:应小心地改变滥用反射。这是迟早会击中你自己脚的一个好办法


更新当然setvalue是一种方法,更改此方法

您不能以这种方式基于
.GetType()
创建实例

这是行不通的:

new props.GetType();
您应该尝试使用:

Activator.CreateInstance(props.GetType());

您不能以这种方式在
.GetType()
的基础上创建实例

这是行不通的:

new props.GetType();
您应该尝试使用:

Activator.CreateInstance(props.GetType());

基于已经提供的解决方案,您的代码应该如下所示:

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

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

基于已经提供的解决方案,您的代码应该如下所示:

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


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

Hrm,SetValue是一种方法,因此
。SetValue(Activator…
),但它需要第二个参数,因此我仍然遇到同样的问题,并为kicks和giggles传入
null
,使我
没有为此对象定义无参数构造函数。
props.SetValue=…
应该是
props.SetValue>(这是Activator.CreateInstance(props.GetType())
您应该为要为其创建类的每个类添加一个默认的空构造函数。一个默认的构造函数或确保根本没有构造函数,默认值将是createdHrm,SetValue是一个方法,因此
。SetValue(Activator…)
但是它需要第二个参数,所以我仍然被同样的问题困扰着,为kicks and giggles传入
null
会让我
没有为此对象定义无参数构造函数。
props.SetValue=…
应该是
props.SetValue(这是Activator.CreateInstance(props.GetType())
您应该为要为其创建类的每个类添加一个默认空构造函数。请创建一个默认构造函数或确保根本没有构造函数,然后将创建一个默认构造函数
没有为此对象定义无参数构造函数。
它需要第二个参数:一个值
没有为此对象定义无参数构造函数ct.
它需要第二个参数:在
Activator.CreateInstance
上为这个对象定义一个值
无参数构造函数。这些是
ClsAggModel
中的模型第一个EF类。我可以将每个类扩展为部分并处理构造函数,但这种类型会破坏迭代的目的。你能解释一下吗se向我们提供引发此错误的属性的类型?遍历“all”属性可能会得到一些不需要的属性。据我所知,如果类未扩展,模型优先实体应该只有默认构造函数。它是一个聚合类,其中每个属性都是实体框架模型。例如,
pAccount
将是一个包含模型优先实体框架类
的属性>account表的account
。与model first EF对象一样,该对象本身是基本类型属性的集合,如string、int等。在调试时,观察
prop.GetType()
的窗口名返回
prop.GetType(){name=“RuntimePropertyInfo”FullName=“System.Reflection.RuntimePropertyInfo”}System.Type{System.RuntimeType}
顺便说一句,这不是一些“意外”属性。我想知道prop.PropertyType和prop.Name(不是PropertyInfo类型中的属性)在抛出异常时的情况。PropertyType是
prop.PropertyType{Name=“accounter”FullName=“WCF\u Tracker\u Library.accounter”}System.Type{System.RuntimeType}
名称是:“pAccount"如我所说,是实体框架对象,因为我正在迭代其属性的类是EF对象的聚合类。
Activator.CreateInstance
上没有为该对象定义无参数构造函数。这些是
ClsAggModel
中的模型优先EF类。我可以将每个类扩展为部分类并处理h是构造函数,但这种类型有点违背了迭代的目的。您能提供引发此错误的属性类型吗