代码之家  ›  专栏  ›  技术社区  ›  cllpse

可以对匿名类型的属性实现setter

  •  1
  • cllpse  · 技术社区  · 14 年前

    考虑以下内容:

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

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

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

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

    我想也许这可以通过对象的扩展方法来实现; o.SetProperty(o.Foo, "foo!"); 如果不能在对象的构造中实现内嵌的setter。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Johannes Rudolph    14 年前

    匿名类型在设计上是不可变的,因此您无法更改它们的状态。您可以使用反射(如MarkGravell正确指出的那样),但无论从性能角度还是从设计角度来看,这都不是您想要的。

    您有多种选择可以解决此问题:

    • 使用元组而不是注释性类型。请注意,它们也是不可变的,但是您可以更容易地使用它们来创建类似 tupleA.WithItem2(newValueForItem2) . 类似于 string 班级。
    • 使用自动属性编写自己的“命名”类型,通常很简单
    • 使用类似coderush的重构工具,它可以根据您的使用情况生成“已命名”类型
        2
  •  7
  •   Brian Rasmussen    14 年前

    不,因为C中的匿名类型在设计上是不可变的。