2013-05-16 184 views
5

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

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

这是调用类的方法。

foreach (Class name in this.list) 
{ 
    ClassBeingCalled class = new ClassBeingCalled (name); 
    class.Populate(); 
    this.newlist.Add(class); 
} 

现在里面的类被称为,我需要动态创建,这将在该类的“填充”方法来设置30点左右的属性。

是这样的...

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

刚刚使用'listofproperties'而不是尝试创建动态属性有什么问题?如果它必须是Dynamic请看http://msdn.microsoft.com/en-us/library/vstudio/dd264741.aspx – pingoo

+0

你是什么意思? –

+0

做那些东西*存在*作为属性?即你想创建* new *属性?或将值分配给现有的属性? –

回答

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

在这一天结束,它可能是最好的,如果你解释这个问题找你e试图解决,因为可能有更好的方法来完全处理它。

+0

我以为我在上面做过:-(。您还需要什么其他信息? –

+0

您建议您已经在类中设置属性的解决方案并告诉我们你需要添加属性,实际上你应该在这里查看选项c(在这个问题中也被其他人建议),而不是设置属性,只需在内部字典中设置值 –

+0

我将如何在字典中定义属性的类型? –

1

不可能在动态时将动态属性添加到已编译的类。您只能将动态属性添加到类中,同时使用Reflection.Emit

构建类本身。您的其他选项可能是使用字典或ExpandoObject(实际上它是字典)。但是对于这个选项,你不能使用反射来访问你的动态属性。