如何向JObject中动态添加遍历得到的新对象?
正确实现遍历添加属性到JObject的方式
嘿,我懂你遇到的问题了——直接在JObject的初始化器里塞foreach语句肯定行不通,因为C#的对象初始化器只支持表达式,不允许放这种语句类的逻辑。给你两种靠谱的实现方式:
方法1:先初始化基础结构,再循环添加属性
这种方式比较直观,先把固定的JObject结构建好,再找到要添加属性的目标JObject,循环把myObject的内容加进去:
// 先构建基础的JObject结构 JObject grid = new JObject( new JProperty("myprop", "value 1"), new JProperty("name", new JArray( new JObject( new JProperty("myprop2", "value 2") ) )) ); // 找到数组里的那个JObject var targetObj = (JObject)((JArray)grid["name"])[0]; // 遍历myObject,添加属性 foreach(var value in myObject) { targetObj.Add(new JProperty(value.Name, value.Value)); }
方法2:用LINQ表达式嵌入初始化器(更简洁)
如果想在初始化的时候一次性搞定,可以用LINQ把myObject转换成JProperty的集合,然后和原来的固定属性合并,直接传给JObject的构造函数:
JObject grid = new JObject( new JProperty("myprop", "value 1"), new JProperty("name", new JArray( new JObject( // 固定属性 new JProperty("myprop2", "value 2"), // 用LINQ把myObject转成JProperty,展开成参数 myObject.Select(v => new JProperty(v.Name, v.Value)).ToArray() ) )) );
为啥原来的写法不行?
C#的对象初始化语法(比如new JObject(...))里,括号内只能放表达式,而foreach是一个语句,语法上不允许把语句放在表达式的位置。上面的第二种方法用LINQ的Select把循环逻辑转换成了表达式,所以能直接嵌入初始化器里。
内容的提问来源于stack exchange,提问作者brother
相关产品推荐
相关产品推荐

