web-dev-qa-db-ja.com

C#匿名タイプを割り当てることはできません-読み取り専用です

このコードスニペットの何が問題になっていますか?

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

値を匿名型オブジェクトにリセットするにはどうすればよいですか?

44
user366312

C#の匿名型は不変であるため、プロパティセッターメソッドはありません。値を使用して新しい匿名タイプを作成する必要があります

obj = new { Name = "asdasd", Price = 11.00 };
60
JaredPar

匿名タイプは、読み取り専用プロパティで作成されます。オブジェクト構築後にそれらに割り当てることはできません。

匿名タイプ(C#プログラミングガイド) からMSDN:

匿名型は、最初に型を明示的に定義することなく、読み取り専用プロパティのセットを単一のオブジェクトにカプセル化する便利な方法を提供します。

20
user151323

匿名型は、最初に型を明示的に定義することなく、読み取り専用プロパティのセットを単一のオブジェクトにカプセル化する便利な方法を提供します。タイプ名はコンパイラーによって生成され、ソースコードレベルでは使用できません。プロパティのタイプはコンパイラーによって推測されます。次の例は、AmountとMessageという2つのプロパティで初期化される匿名型を示しています。

http://msdn.Microsoft.com/en-us/library/bb397696.aspx

7
Yannick Motton

古い質問ですが、私自身も同じ問題に遭遇しました。オブジェクトの作成後のプロパティの更新/追加をサポートする ExpandoObject を使用することになりました。私はそれがC#4以来存在していると信じています。

dynamicの代わりに)キーワードvarを使用してオブジェクトを宣言することが重要であることに注意してください。

dynamic person = new ExpandoObject();
person.FirstName = "John";
person.LastName = "Doe";
1
Adi H