fromI有这个linq查询从IQueryable构建一个json(string和bool?):
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 });
因为它是我构建的匿名类型,所以无法找到添加它的方法。我总是以转换错误
结束答案 0 :(得分:2)
嗯,很明显。泛型是不变的。所以另一种类型不适合。您可以使用List<object>
或命名类来存储值。
答案 1 :(得分: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命名约定。
答案 2 :(得分:1)
如果要手动更改结果,则需要将其转换为静态类型而不是动态类型。创建一个具有字符串country和bool schengen的类(您甚至可以在当前类中创建该类以将其隐藏在应用程序的其余部分(如果适用)),将您的linq结果转换为该类,然后添加到该类中。