我正在尝试设置一个类,以便可以使用对象初始化器对其进行初始化,但它包含一些集合。理想情况下,我希望客户端代码能够:
MyClass myObj = new MyClass
{
Name = "Name",
Contents = new[]
{
"Item1",
"Item2"
}
}
但是,其中Contents
需要是一个BindingList<string>
。底层字段存储了对该列表的只读引用,我希望setter在设置内容时先执行Clear
,然后再执行AddRange
。
我不能将Contents
属性设置为IEnumerable<string>
,因为客户机代码不能看到Add
方法,至少在不强制转换它的情况下是看不到的。我不能使它成为BindingList<string>
,因为如果我设置它,我需要构造一个新的绑定列表来传递给它。这可能是可能的,但我不希望仅仅为了将其传递给属性设置器而构造新的BindingList<string>
的效率低下。
理想的做法是让getter返回一个BindingList<string>
,而setter接受IEnumerable<string>
,但是C#不允许属性上的getter/setter有不同的类型。
哦,而且在BindingList<string>
和IEnumerable<string>
之间进行隐式强制转换是一个禁忌,所以我也不能这样做(http://blogs.msdn.com/b/peterhal/archive/2005/06/20/430929.aspx)。
有什么办法可以解决这个问题吗?
发布于 2010-07-25 23:28:32
C#初始值设定项语法将自动对属性的集合对象调用Add
方法。当然,这不会预先调用Reset()
,但是对象在这一点上仍然是空的,所以这并不重要。
替换列表必须使用属性集语法吗?让setter替换集合的内容而不实际更改集合对象标识是非常出乎意料的,并且可能会导致错误。
发布于 2010-07-25 23:20:21
创建从BindingList<string>
派生的自定义集合类,并从类型string[]
添加隐式强制转换
发布于 2010-07-25 23:54:55
我建议您封装BindingList。在这种情况下,回到老式的创建对象的方式,这样就不会创建不必要的耦合。比起语言约定,更喜欢好的OO。
https://stackoverflow.com/questions/3331404
复制相似问题