我试图在运行时创建对象。我们有.net框架提供了类似DynamicObject和ExpandoObject的类。是否可以创建像这样的动态对象
dynamic obj = new expandoObject();
obj["propName1"] = "name"; //string type
obj["propName2"] = 24; //int type
直到运行时我才知道属性名称。有可能这样做吗?
答案 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.WriteLine
对dynamic
值感到高兴,所以我不得不在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"]);
}