动态地向对象添加属性

时间:2014-02-04 18:43:35

标签: c# .net

我试图在运行时创建对象。我们有.net框架提供了类似DynamicObject和ExpandoObject的类。是否可以创建像这样的动态对象

dynamic obj = new expandoObject();
obj["propName1"] = "name"; //string type
obj["propName2"] = 24; //int type

直到运行时我才知道属性名称。有可能这样做吗?

1 个答案:

答案 0 :(得分:4)

嗯,有两件事。

首先,是的,你可以使用字符串中包含的“属性名称”将值填充到ExpandoObject对象中,因为它实现了IDictionary<string, object>,所以你可以这样做这样:

void Main()
{
    dynamic obj = new ExpandoObject();
    var dict = (IDictionary<string, object>)obj;
    dict["propName1"] = "test";
    dict["propName2"] = 24;

    Debug.WriteLine("propName1=" + (object)obj.propName1);
    Debug.WriteLine("propName2=" + (object)obj.propName2);
}

注意我如何使用属性语法来检索那里的值。不幸的是,dynamic就像病毒一样传播,Debug.WriteLinedynamic值感到高兴,所以我不得不在object进行投射。

然而,这是第二件事,如果您在运行时之前不知道属性名称,那么最后两行不会出现在程序中的任何位置。检索值的唯一方法是再次将其强制转换为字典。

所以你最好只使用字典开头:

void Main()
{
    var obj = new Dictionary<string, object>();
    obj["propName1"] = "name";
    obj["propName2"] = 24;

    Debug.WriteLine("propName1=" + obj["propName1"]);
    Debug.WriteLine("propName2=" + obj["propName2"]);
}