如何向匿名类型添加新值

3

能否向现有的JSON对象添加值?

我的示例代码:

var obj = new { Vall = "myVal1", Val2 = "myVal2", Val3 = "myVal3" };

这是我想要做的:

obj.AddValue(Val4, "myVal4");

1
@TheRuler JSON将会有"Val1": "myVal1" - 请注意键被引用,分隔符为冒号。 - Marc Gravell
可能是为什么C#中匿名类型的属性是只读的?的重复问题。 - enkryptor
3个回答

4
var obj = new { Vall = "myVal1", Val2 = "myVal2", Val3 = "myVal3" };

尽管它们看起来相似,但它不是JSON。这是由编译器生成的“匿名类型”,这意味着编译器为您创建了一个类型,其中包含三个名为 Val1 Val2 Val3 string 属性。除了您无法说出类型名称(它是匿名的)之外,它是一个非常正常的.NET类。不,您无法在运行时向类添加额外的属性。

与您想要的最接近的东西可能是 ExpandoObject ,但老实说,这听起来像是您正在尝试做一些奇怪的事情。


2
正如其他人指出的那样,这里涉及到的是匿名类型,而不是JSON对象。不幸的是,它们是编译代码中自动生成的类型,这意味着它们不能按您的意愿进行更改。
一个简单的解决方法是声明一个新的匿名类型,可以存储额外的字段,并将公共字段的值设置为旧对象的值,如下所示:
var obj_old = new { Vall = "myVal1", Val2 = "myVal2", Val3 = "myVal3" };
var obj_new = new { Vall = obj_old.Vall, Val2 = obj_old.Val2, Val3 = obj_old.Val3, Val4 = "myVal4" };

或者,可以声明一个带有附加字段的对象,在需要时设置其值:

var obj = new { Vall = "myVal1", Val2 = "myVal2", Val3 = "myVal3", Val4 = String.Empty };
// ...
obj.Val4 = "myVal4";

1
在C#中,匿名类型的属性是只读的,你可以使用Json.Net克隆该对象并添加自己的属性,例如:
    var obj = new { ID = 1234, Name = "FooBar" };
    obj = JObject.FromObject(obj).Add("feeClass", "A");

最终的 JSON 数据:
{
  "ID": 1234,
  "Name": "FooBar",
  "feeClass": "A"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接