是否可以在匿名类型的属性上实现setter

时间:2010-08-24 10:57:33

标签: c# generics

请考虑以下事项:

var o = new { Foo = "foo", Bar = "bar" };

此实例是只读的,因为匿名类型不像类那样实现setter:

public class O
{
    public String Foo { get; set; }
    public String Bar { get; set; }
}

是否可以“打开”匿名实例并允许更改其属性?最好用比创建课程所需的字符少的字符。

我想也许这可以通过Object上的扩展方法完成; o.SetProperty(o.Foo, "foo!");,如果你无法在构造对象时在线实现setter。

2 个答案:

答案 0 :(得分:7)

不,导致C#中的匿名类型在设计上是不可变的。

答案 1 :(得分:3)

匿名类型在设计上是不可变的,因此您无法更改其状态。您可以使用反射(正如Mark Gravell正确指出的那样),但从设计的角度来看,这也不是理想的表现。

您可以通过多种方式解决此问题:

  • 使用元组而不是匿名类型。请注意,它们也是不可变的,但您可以更轻松地使用它们来创建tupleA.WithItem2(newValueForItem2)之类的方法。与string类相似。
  • 使用自动属性编写您自己的“命名”类型,通常很简单
  • 使用像CodeRush这样的重构工具,可以根据您的使用情况生成“命名”类型