C#-动态添加对象(添加动态属性名)我正在尝试创建一些动态ExpandoObjects。我遇到了一个问题。因为我不知道我的对象中这些不同属性的名称应该是什么,所以我不能这样做:varlist=newArrayList();varobj=newExpandoObject();obj.ID=1,obj.Product="Pie",obj.Days=1,obj.QTY=65list.Add(obj);让我解释一下我的情况:我想从一个随机数据库中获取数据(我不知道是哪个,但是从我从UI获取的内容来构建连接字符串),所以我不知道我需要获取哪些数据.这可能是数据库表的示例TableSales这可能是另一个示例:TableFoobar如您所见,我不知道数据库是什么样的(它是100%匿名的,因此需要100%动态)以及什么我想返回数据应该像这样的格式正确的JSON:[{"ID":1,"Product":"Pie""Days":1,"QTY":65},{"ID":2,"Product":"Melons""Days":5,"QTY":12}]或者,另一个例子:[{"ID":1,"Days":2,"QTY":56,"Product_Id":5,"Department_Id":2}{"ID":2,"Days":6,"QTY":12,"Product_Id":2,"Department_Id":5}]我试过使用这些ExpandoObjects,但它似乎无法让它工作,因为我无法按照顶部的问题进行操作(我不知道该属性的名称)。有没有办法让我这样说:varobj=newExpandoObject();varpropName="产品";varobj.propName="Pie"Console.WriteLine("让我们打印!:"+obj.Product);//OUTPUTLet'sprint!:Pie有没有人有解决方案,只要指导一个结构,就可以解决这种情况?您可以创建一个List>而不是创建ExpandoObject或其他动态类型,其中每个Dictionary都包含要序列化的名称/值对。然后使用Json.NET(或JavaScriptSerializer,尽管不太灵活)序列化为JSON:varlist=newList>();//使用字典初始化程序构建字典条目:https://msdn.microsoft.com/en-us/library/bb531208.aspxlist.Add(newDictionary{{"ID",1},{"Product","Pie"},{"Days",1},{"QTY",65}});//逐步构建字典条目//请参阅https://msdn.microsoft.com/en-us/library/xfhwa508%28v=vs.110%29.aspxvardict=newDictionary();dict["ID"]=2;dict["Product"]="Melons";dict["Days"]=5;dict["QTY"]=12;list.Add(dict);Console.WriteLine(JsonConvert.SerializeObject(list,Formatting.Indented));Console.WriteLine(newJavaScriptSerializer().Serialize(list));第一项输出:[{"ID":1,"Product":"Pie","Days":1,"QTY":65},{"ID":2,"Product":"Melons","Days":5,"QTY":12}]第二个输出相同,没有缩进:[{"ID":1,"Product":"Pie","Days":1,"QTY":65},{"ID":2,"Product":"Melons","Days":5,"QTY":12}]使用动态,然后强制转换为IDictionary以迭代您的属性:dynamicobj=newExpandoObj等();obj.Product="馅饼";obj.Quantity=2;//遍历所有添加的属性foreach(varpropin(IDictionary)obj){Console.WriteLine(prop.Key+":"+prop.Value);我做了一个小提琴:https://dotnetfiddle.net/yFLy2u现在这里是你的问题的解决方案......其他答案如@dbc可能更适合这个问题(这不是问题,真的)作为你看到的ExpandoObject类在这里,ExpandoObject正在实现IDictionary,因此您可以像这样使用事实IDictionaryIDictionaryobj=newExpandoObject();varpropName="产品";obj[propName]="Pie"Console.WriteLine("让我们打印!:"+obj[propName]);//验证它是否正常工作Console.WriteLine("Let'sprintagain!:"+((dynamic)obj).Product);当我写我的答案时,我看到你已经得到了正确的答案你可以使用字典甚至元组。但是根据您最初的问题,您想动态添加属性。为此,您可以使用ExpandoObject参考其他答案。这是使用类似代码的类的相同解决方案(使用ExpandoObject动态添加属性)。//示例类publicclassDictKey{publicstringDisplayName{get;放;}publicDictKey(stringname){DisplayName=name;}}publicclassDictValue{publicintColumnIndex{get;放;}publicDictValue(intidx){ColumnIndex=idx;}}//实用方法publicstaticIDictionaryGetExpando(KeyValuePair>dictPair){IDictionarydynamicObject=newExpandoObject();dynamicObject["Station"]=dictPair.Key.DisplayName;foreach(varitemindictPair.Value){dynamicObject["Month"+(item.ColumnIndex+1)]=item;}返回动态对象;}Ans使用方法示例:vardictionaryByMonth=newDictionary>();dictionaryByMonth.Add(newDictKey("Set1"),newList{newDictValue(0),newDictValue(2),newDictValue(4),newDictValue(6),newDictValue(8)});dictionaryByMonth.Add(newDictKey("Set2"),newList{newDictValue(1),newDictValue(2),newDictValue(5),newDictValue(6),newDictValue(11)});varrowsByMonth=dictionaryByMonth.Select(item=>GetExp安藤(项目));第一部分,彻底阅读C#团队的这篇博文让我们看看您的代码varobj=newExpandoObject();varpropName="产品";varobj.propName="Pie"控制台。WriteLine("让我们打印!:"+obj.Product);//OUTPUTLet'sprint!:Pie在您的代码中,您使用的是varobj=newExpandoObject();所以你正在创建一个静态类型的ExpandableObject类型的对象。在他们特别提到的博客中,我没有写ExpandoObjectcontact=newExpandoObject()因为如果我写了contact将是一个ExpandoObject类型的静态类型对象。当然,静态类型变量不能在运行时添加成员。所以我使用了新的动态关键字而不是类型声明,代码有效是因为ExpandoObject支持动态操作所以如果你重写你的代码以使用动态对象,并将动态属性添加为属性,它应该可以工作!但是对于你的具体用例,你最好使用上面@dbc建议的字典以上是C#学习教程分享的全部内容:C#-动态添加对象(添加动态属性名),如果对大家有用的话并且需要了解更多C#学习教程,希望大家多多关注——dynamicobj=newExpandoObject();obj.Product="Pie"Console.WriteLine("打印吧!:"+obj.Product);//OUTPUTLet'sprint!:Pie本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
