1

fromIQueryable から(文字列とブール値の)jsonを構築するためのこのlinqクエリがあります:

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

匿名型は引き続き静的に型指定され、C#コンパイラは匿名型定義の出現ごとに個別のクラスを生成します。この場合、名前付きクラスが必要です。とにかく、データ転送オブジェクトには良い習慣です。私は、データ注釈とDataContractJsonSerializerを使用して、このようなJSONDTOを使用しています。

[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 に答える
2

それは明らかです。ジェネリックは不変です。そのため、別のタイプは適合しません。または名前付きクラスを使用List<object>して、値を格納できます。

于 2012-11-15T13:36:59.453 に答える
1

結果を手動で変更する場合は、動的タイプではなく静的タイプにキャストする必要があります。文字列countryとboolschengenを持つクラスを作成し(該当する場合は、現在のクラス内にクラスを作成して、アプリケーションの他の部分から非表示にすることもできます)、linqの結果をそのクラスにキャストしてから追加します。

于 2012-11-15T13:39:57.570 に答える