动态添加属性C#

时间:2013-05-16 11:00:20

标签: c#

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

我有一个在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);
 }

2 个答案:

答案 0 :(得分:4)

有几种方法可以解决这个问题。

a)您可以使用反射在运行时使用您需要的任何内容生成类。您始终可以从包含Populate的基类派生此生成的类,但我认为不需要。

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

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

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

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

通过使用方法3,您实际上是根据string进行索引,这可能会更好地根据您的要求...您可以按照以下方式执行操作:

foreach (PropertyToAssign count2 in listofproperties)
{
    string name = "_nameofproperty" + count2.name;
    this[name] = count2.value;
}

在一天结束时,如果你解释你想要解决的问题可能是最好的,因为可能有更好的方法来完全解决它。

答案 1 :(得分:1)

无法动态地向动态属性添加动态属性。您只能使用Reflection.Emit

动态构建类本身时向类添加动态属性

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