C# 向类C动态添加属性#

C# 向类C动态添加属性#,c#,C#,我想动态地向类添加属性,并为它们设置值。有没有人能给我指出一些教程或文章的正确方向,或者提供一个更好的例子 我有一个在foreach循环中调用的基类。在这个类中,我需要添加多达30个属性并为它们设置值 这是调用该类的方法 foreach (Class name in this.list) { ClassBeingCalled class = new ClassBeingCalled (name); class.Populate(); this.newlist.Add(cl

我想动态地向类添加属性,并为它们设置值。有没有人能给我指出一些教程或文章的正确方向,或者提供一个更好的例子

我有一个在foreach循环中调用的基类。在这个类中,我需要添加多达30个属性并为它们设置值

这是调用该类的方法

foreach (Class name in this.list)
{
    ClassBeingCalled class = new ClassBeingCalled (name);
    class.Populate();
    this.newlist.Add(class);
}
现在在被调用的类中,我需要动态创建大约30个属性,这些属性将在该类的“Populate”方法中设置

就像这样

 foreach (PropertyToAssign count2 in listofproperties)
 {
     string name = "_nameofproperty" + count2.name
     base.GetType().GetField(name, BindingFlags.NonPublic |
                          BindingFlags.Instance).SetValue(this, count2);
 }

有几种方法可以做到这一点

a) 您可以使用反射在运行时生成包含所需内容的类。您总是可以从包含
Populate
的基类派生这个生成的类,但我看不出有什么必要

b) 如果您使用的是C#4.0+,则可以使用,它允许您根据需要设置任何属性。请注意,这些属性本身并没有添加为属性,因为它使用的是完全基于运行时的DLR。根据您的需要,这可能很好;这与方法c几乎相同,但使用DLR

c) 您可以使用支持字典并使用,如下所示:

private Dictionary<string, object> _internalData = new Dictionary<string, object>();

public T this[string propName]
{
    get {
        return _internalData[propName];
    }
    set {
        _internalData[propName] = value;
    }
}


在一天结束时,最好解释一下您试图解决的问题,因为可能有更好的方法完全解决这个问题。

不可能动态地向编译类添加动态属性。您只能在动态构建类本身时使用


您的另一个选择可能是使用字典或(实际上是字典)。但对于此选项,您无法使用反射访问动态属性。

仅使用“listofproperties”而不尝试创建动态属性有什么错?如果它必须是动态的,那么看看这些东西是否作为属性存在?i、 e.您是否正在尝试创建新的属性?或为现有属性赋值?正在尝试创建新属性。目前,它有一组属性,我想将其更改为动态。例如,它有10个属性。但是,如果将新属性添加到listofproperties,则会在此处出错:base.GetType().GetField(名称,BindingFlags.NonPublic | BindingFlags.Instance).SetValue(此,count2);由于有比定义的属性更多的属性。我认为你应该考虑只使用一个带有索引器的内部字典,这样你就可以访问你的属性,比如“代码> MyObj[[ PrimeTyNe]”//Cuth>(你可以用一个有效的方法来实现)。BTW,在标题中,它表示“属性”,但是在填充方法中,它反映了“字段”。我认为我在上面做了:-(.您还需要什么其他信息?您建议了您已经存在的在类上设置属性的解决方案,并告诉我们您需要添加属性。实际上,您可能应该在这里查看选项c(在这个问题中也有其他人建议)而不是设置属性,只需在内部字典上设置值。我如何定义字典中的属性类型?嗯,你不需要。你可以使用
对象
,这样你就可以在其中粘贴任何内容。如果你只有一个数据类型,你可以随时将
对象
更改为
字符串
,或者其他类型。嗨Rudi,我遇到以下错误:在我添加以下内容后,无法将带[]的索引应用于“BusinessLogic.InvoiceBaseUIBindable”类型的表达式-this[name]=count2.value;
foreach (PropertyToAssign count2 in listofproperties)
{
    string name = "_nameofproperty" + count2.name;
    this[name] = count2.value;
}