1

从我有这个 linq 查询来从 IQueryable 构建一个 json(字符串和布尔值?):

var ret = from c in results select new { country = c.EN, schengen = c.Schengen };

我想手动添加新项目:(伪代码)

ret = ret /* add this -> */ { country = "some new country", schengen = true }

我试过这样做:

//End up with cannot convert from AnonymousType#2 to AnonymousType#1
var listRet = ret.ToList();
listRet.Add(new { country ="", schengen = true });

由于它是我构建的匿名类型,我找不到添加它的方法。我总是以转换错误告终

4

3 回答 3

2

很明显。泛型是不变的。所以另一种类型不适合。您可以使用List<object>或命名类来存储值。

于 2012-11-15T13:36:59.453 回答
2

匿名类型仍然是静态类型的,C# 编译器为每个匿名类型定义出现生成一个单独的类。在这种情况下,您需要一个命名类。无论如何,对于数据传输对象来说,这是一个很好的做法。我使用这样的 JSON DTO,使用数据注释和 DataContractJsonSerializer。

[DataContract]
public class CountryInfo
{
    [DataMember(Name = "country")]
    public string Country { get; set; }

    [DataMember(Name = "schengen", EmitDefaultValue = false)
    public bool? Schengen { get; set; }
}

这样我就有了一个有据可查的 JSON“协议”,它在序列化之前也使用 C# 命名约定,但之后使用 JS 命名约定。

于 2012-11-15T13:46:46.933 回答
1

如果要手动更改结果,则需要将其转换为静态类型而不是动态类型。创建一个具有字符串 country 和 bool schengen 的类(如果适用,您甚至可以在当前类中创建该类以将其隐藏在应用程序的其余部分中),将您的 linq 结果转换为该类,然后添加到它。

于 2012-11-15T13:39:57.570 回答