我正在尝试建立一个类,以便可以使用对象初始化程序对其进行初始化,但是它包含一些集合。理想情况下,我希望客户端代码能够执行以下操作:

MyClass myObj = new MyClass
{
  Name = "Name",
  Contents = new[]
  {
    "Item1",
    "Item2"
  }
}


但是,Contents必须是BindingList<string>。基础字段存储对此列表的只读引用,我希望设置器本质上先执行Clear,然后执行AddRange设置内容。

我不能将Contents属性设置为IEnumerable<string>,因为在许多其他代码中,客户端代码看不到Add方法,至少在没有首先强制转换的情况下。我不能将其设置为BindingList<string>,因为如果设置了它,则需要构造一个新的绑定列表以传递给它。仅用于将其传递给资产设置者的目的。

理想的操作是让getter返回BindingList<string>,并且setter接受BindingList<string>,但是C#不允许属性上的getter / setter使用不同的类型。

哦,在IEnumerable<string>BindingList<string>之间隐式强制转换是不行,所以我也不能这样做(http://blogs.msdn.com/b/peterhal/archive/2005/06/20/430929.aspx)。

有没有办法解决?

最佳答案

C#初始化程序语法将自动在属性的集合对象上调用Add方法。那当然不会事先调用Reset(),但是那时该对象仍然是空的,所以没关系。

替换列表是否必须使用属性集语法?让setter替换集合的内容而不实际更改集合对象的标识非常令人意外,并且可能会导致错误。

10-01 02:15
查看更多