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

C#中能否向匿名对象追加属性?如何实现?

解答:C#中能否为已创建的匿名类型对象添加新字段?

嘿Andrea,我来帮你理清这个问题!

首先直接给结论:你不能给已经创建好的匿名类型对象添加新字段。原因很简单:C#里的匿名类型是编译时自动生成的密封类,它的所有属性都是只读的,对象的结构在编译阶段就完全确定了——一旦创建完成,就没法修改它的成员结构,也不能添加新的属性或字段。

不过别担心,有几种替代方案可以满足你“动态扩展对象成员”的需求,下面给你逐一说明:

1. 使用ExpandoObject实现动态属性

如果你需要真正的动态对象,能随时添加新成员,ExpandoObject是最合适的选择。它属于动态类型,支持在运行时自由添加属性:

dynamic myObject = new ExpandoObject();
myObject.a = "First";
myObject.b = "Second";
// 声明后随时添加新字段
myObject.c = "Third";

另外,ExpandoObject还实现了IDictionary<string, object>接口,所以你也可以用字典的方式来操作它的成员,比如:

var expando = (IDictionary<string, object>)myObject;
expando.Add("d", "Fourth");

⚠️ 注意:使用动态类型会失去编译时的类型检查,所以如果属性名拼写错误,只有在运行时才会报错。

2. 使用Dictionary<string, object>存储键值对

如果不需要动态属性的语法糖(比如.访问成员),用字典来存储键值对是更直接的选择,同时保留了一定的类型可控性:

var myObject = new Dictionary<string, object>
{
    {"a", "First"},
    {"b", "Second"}
};
// 添加新字段
myObject.Add("c", "Third");
// 访问值:var cValue = myObject["c"];

这种方式适合只需要简单键值存储的场景,操作起来清晰直观。

3. 创建新的匿名类型对象(替代修改原对象)

如果你的需求只是得到一个包含新字段的对象,而不是必须修改原对象,那么可以创建一个新的匿名类型对象:

  • 在C# 10及以上版本,你可以用with表达式快速扩展匿名类型:
    var myObject = new { a = "First", b = "Second" };
    var newObject = myObject with { c = "Third" };
    
  • 对于更早的C#版本,直接手动创建新的匿名对象即可:
    var myObject = new { a = "First", b = "Second" };
    var newObject = new { myObject.a, myObject.b, c = "Third" };
    

这种方式的好处是保留了匿名类型的静态类型检查,但要注意:原对象myObject不会被修改,你得到的是一个全新的对象。

4. 自定义类/结构体(推荐场景)

如果这个对象的结构在你的代码中会被多次使用,或者你需要严格的类型安全,最推荐的方式是自定义一个类:

public class MyData
{
    public string a { get; set; }
    public string b { get; set; }
    // 可以后续随时添加新属性
    public string c { get; set; }
}

// 使用时
var myObject = new MyData { a = "First", b = "Second" };
myObject.c = "Third";

自定义类不仅支持自由添加成员,还能享受编译时类型检查、智能提示等优势,代码的可读性和可维护性也更好。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:31:22