我想动态地向类添加属性并为它们设置值。有人能指出我正确的方向指向一些教程或文章,甚至更好地提供一个例子。
我有一个在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);
}
答案 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(实际上是字典)。但是对于此选项,您无法使用反射访问动态属性。