このコードスニペットの何が問題になっていますか?
class Program
{
static void Main(string[] args)
{
var obj = new { Name = "A", Price = 3.003 };
obj.Name = "asdasd";
obj.Price = 11.00;
Console.WriteLine("Name = {0}\nPrice = {1}", obj.Name, obj.Price);
Console.ReadLine();
}
}
次のエラーが発生します。
Error 5 Property or indexer 'AnonymousType#1.Name' cannot be assigned to -- it is read only .....\CS_30_features.AnonymousTypes\Program.cs 65 13 CS_30_features.AnonymousTypes
Error 6 Property or indexer 'AnonymousType#1.Price' cannot be assigned to -- it is read only .....\CS_30_features.AnonymousTypes\Program.cs 66 13 CS_30_features.AnonymousTypes
値を匿名型オブジェクトにリセットするにはどうすればよいですか?
C#の匿名型は不変であるため、プロパティセッターメソッドはありません。値を使用して新しい匿名タイプを作成する必要があります
obj = new { Name = "asdasd", Price = 11.00 };
匿名タイプは、読み取り専用プロパティで作成されます。オブジェクト構築後にそれらに割り当てることはできません。
匿名タイプ(C#プログラミングガイド) からMSDN:
匿名型は、最初に型を明示的に定義することなく、読み取り専用プロパティのセットを単一のオブジェクトにカプセル化する便利な方法を提供します。
匿名型は、最初に型を明示的に定義することなく、読み取り専用プロパティのセットを単一のオブジェクトにカプセル化する便利な方法を提供します。タイプ名はコンパイラーによって生成され、ソースコードレベルでは使用できません。プロパティのタイプはコンパイラーによって推測されます。次の例は、AmountとMessageという2つのプロパティで初期化される匿名型を示しています。
古い質問ですが、私自身も同じ問題に遭遇しました。オブジェクトの作成後のプロパティの更新/追加をサポートする ExpandoObject を使用することになりました。私はそれがC#4以来存在していると信じています。
(dynamic
の代わりに)キーワードvar
を使用してオブジェクトを宣言することが重要であることに注意してください。
dynamic person = new ExpandoObject();
person.FirstName = "John";
person.LastName = "Doe";