You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何为已创建的匿名对象列表添加额外属性?

解决匿名对象动态添加属性的问题

这确实是个常见的痛点——C#里的匿名类型是不可变的密封类型,一旦创建就没法动态添加新属性,这也是你尝试ExpandoObject却没得到预期结构的核心原因。不过别担心,咱们有几种靠谱的解决方案,根据你的需求来选:

方案1:改用ExpandoObject并映射原有属性

匿名对象不能扩展,但ExpandoObject是动态的“可扩展对象”,我们可以先把匿名对象的属性复制到ExpandoObject里,再批量添加额外属性。示例代码如下:

// 假设ListOfAdditionalProperties是KeyValuePair<string, object>类型的集合
var result = data.Select(p => {
    dynamic expando = new ExpandoObject();
    // 先把原匿名类型的属性一一复制过来
    expando.FirstName = p.FirstName;
    expando.LastName = p.LastName;
    expando.Relationship = p.RelationshipType;
    expando.TierType = p.TierType;
    expando.Gender = p.GenderType;
    expando.AnnualSalary = p.AnnualSalary;
    
    // 遍历添加额外属性
    var expandoDict = (IDictionary<string, object>)expando;
    foreach (var prop in ListOfAdditionalProperties) {
        expandoDict[prop.Key] = prop.Value;
    }
    
    return expando;
}).ToList();

这样得到的List<dynamic>里,每个元素都包含你原本定义的属性,再加上新增的额外属性,访问的时候直接用item.NewPropertyName就行。

方案2:自定义DTO类(推荐长期使用)

如果这些对象后续还要频繁操作、传递,直接定义一个DTO(数据传输对象)类是更稳妥的选择——类型安全、性能更好,也方便后续维护。示例:

首先定义类:

public class PersonInfo {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Relationship { get; set; }
    public string TierType { get; set; }
    public string Gender { get; set; }
    public decimal AnnualSalary { get; set; }
    // 用字典存储额外属性,或者如果属性是固定的可以直接加对应的属性
    public Dictionary<string, object> AdditionalProperties { get; set; } = new();
}

然后生成列表并添加属性:

// 先初始化基础属性
var result = data.Select(p => new PersonInfo {
    FirstName = p.FirstName,
    LastName = p.LastName,
    Relationship = p.RelationshipType,
    TierType = p.TierType,
    Gender = p.GenderType,
    AnnualSalary = p.AnnualSalary
}).ToList();

// 批量添加额外属性
foreach (var person in result) {
    foreach (var prop in ListOfAdditionalProperties) {
        person.AdditionalProperties[prop.Key] = prop.Value;
    }
}

这种方式虽然多写了一个类,但后续不管是修改属性还是扩展功能都更灵活,也避免了动态类型的潜在问题。

方案3:反射动态创建类型(不推荐)

如果非要追求和原匿名类型一致的“强类型”结构,可以用反射在运行时动态生成包含所有属性的类型,但实现起来复杂,性能也差,除非有特殊业务需求,否则不建议用这种方式。

总结一下:临时场景用ExpandoObject快速解决;长期维护的话,自定义DTO是最优解。

内容的提问来源于stack exchange,提问作者RandomUser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:21:23