C#匿名类型无法分配 - 它是只读的

use*_*312 42 c# anonymous-types c#-3.0

这段代码片有什么问题?

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

如何将值重新设置为匿名类型对象?

Jar*_*Par 59

C#中的匿名类型是不可变的,因此没有属性setter方法.您需要使用值创建一个新的anonmyous类型

obj = new { Name = "asdasd", Price = 11.00 };
Run Code Online (Sandbox Code Playgroud)

  • 还有一点需要注意的是,如果新的匿名类型具有相同顺序的相同数量和类型的属性,它将与第一个类型具有相同的内部类型 (20认同)

小智 20

使用只读属性创建匿名类型.在对象构造之后,您无法分配它们.

从MSDN上的匿名类型(C#编程指南):

匿名类型提供了一种方便的方法,可以将一组只读属性封装到单个对象中,而无需先显式定义类型.


Yan*_*ton 7

匿名类型提供了一种方便的方法,可以将一组只读属性封装 到单个对象中,而无需先显式定义类型.类型名称由编译器生成,在源代码级别不可用.属性的类型由编译器推断.以下示例显示了使用名为Amount和Message的两个属性初始化的匿名类型.

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


Adi*_*i H 5

请改用ExpandoObject,因为它支持在创建对象后更新/添加新属性(自 C# 4 以来一直存在)。

请注意,使用关键字dynamic(而不是var)声明对象很重要

using System.Dynamic;

dynamic person = new ExpandoObject();
person.FirstName = "John";
person.LastName = "Doe";
Run Code Online (Sandbox Code Playgroud)