我正在尝试建立一个类,以便可以使用对象初始化程序对其进行初始化,但是它包含一些集合。理想情况下,我希望客户端代码能够执行以下操作:
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替换集合的内容而不实际更改集合对象的标识非常令人意外,并且可能会导致错误。