5

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

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

2 回答 2

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,您实际上是基于strings 进行索引,这可能根据您的要求更好......因为您可以按照以下方式做一些事情:

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

归根结底,最好解释一下您要解决的问题,因为可能有更好的方法来完全解决它。

于 2013-05-16T11:07:44.900 回答
1

无法动态地将动态属性添加到已编译的类中。您只能在使用Reflection.Emit动态构建类本身时向类添加动态属性

您的其他选择可能是使用 Dictionary 或ExpandoObject(实际上是字典)。但是对于这个选项,您不能使用反射访问您的动态属性。

于 2013-05-16T11:09:34.310 回答