C# 可以在匿名类型的属性上实现setter
考虑以下几点:C# 可以在匿名类型的属性上实现setter,c#,generics,C#,Generics,考虑以下几点: 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,“F
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。否,因为C#中的匿名类型是设计不变的 不,因为C#中的匿名类型是设计不变的 匿名类型在设计上是不可变的,因此您无法更改它们的状态。您可以使用反射(正如MarkGravell正确指出的那样),但无论从设计角度还是从性能角度来看,这都不是理想的性能 您有多种选择来解决此问题:
- 使用元组而不是注释性类型。请注意,它们也是不可变的,但您可以更轻松地使用它们来创建方法,如
。类似于tupleA.WithItem2(newValueForItem2)
类字符串
- 使用自动属性编写自己的“命名”类型,通常很简单
- 使用像CodeRush这样的重构工具,它可以根据您的使用情况生成“命名”类型
- 使用元组而不是注释性类型。请注意,它们也是不可变的,但您可以更轻松地使用它们来创建方法,如
。类似于tupleA.WithItem2(newValueForItem2)
类字符串
- 使用自动属性编写自己的“命名”类型,通常很简单
- 使用像CodeRush这样的重构工具,它可以根据您的使用情况生成“命名”类型