C#中如何向匿名对象的数组属性动态添加对象?
解决匿名对象动态添加元素的问题
我懂你的痛点——早期C#里匿名对象用得少,而且它天生有个关键限制:匿名对象的属性是只读的,初始化时用的数组也是固定长度的,这就是你没法直接给items动态添加元素的原因。不过咱们可以换个思路,先收集元素再生成最终的匿名对象,具体步骤如下:
1. 用列表动态收集产品项
匿名对象本身不可修改,但列表是可变的,我们可以先用列表来存放要添加的产品。注意要保证每个添加的匿名对象结构一致(属性名、类型完全匹配):
// 初始化空列表,用来收集产品 var itemsList = new List<object>(); // 更优雅的方式:如果循环里至少有一个元素,编译器会自动推断列表的匿名类型 // 比如先添加一个临时元素(如果循环可能为空,后续可以移除) // itemsList.Add(new { name = "", value = 0, amount = 0 });
2. 遍历Modelos,向列表添加产品
在foreach循环里,把每个Modelo转换成对应的匿名对象,加入列表:
foreach (var modelo in Modelos) { itemsList.Add(new { name = modelo.ProductName, // 替换成你的Modelo实际属性名 value = modelo.ProductValue, amount = modelo.ProductAmount }); }
3. 生成最终的匿名对象
最后把列表转换成数组,赋值给匿名对象的items属性,同时配置shippings部分:
var body = new { items = itemsList.ToArray(), shippings = new[] { new { name = "Default Shipping Cost", value = 100 } } };
额外提示
- 如果
shippings也需要动态添加,同样可以用列表先收集元素,再转数组赋值。 - 如果你用的是C# 7.0及以上版本,编译器能自动推断列表的匿名类型,不需要显式写
List<object>——只要添加第一个匿名对象后,列表就会自动匹配该类型。
内容的提问来源于stack exchange,提问作者notExactlyAHero
相关产品推荐
相关产品推荐

