2010-07-25 63 views
2

我想设置一个类,以便可以使用对象初始值设定项初始化它,但它包含一些集合。理想情况下,我想客户端代码能够做到:C#对象初始值设定项和集合

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

然而,在Contents需要一个BindingList<string>。底层字段存储对该列表的只读引用,并且我希望制定者基本上执行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)。

有没有办法解决这个问题?

回答

2

C#初始化语法会自动调用你的财产的征收对象上Add方法。当然,事先不会调用Reset(),但该对象在那一点上仍然是空的,所以没关系。

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

1

创建从BindingList<string>派生的自定义集合类和类型添加隐式转换string[]

0

我会推荐封装BindingList。在这种情况下,回到旧派创建对象的方式,以免造成不必要的耦合。在语言惯例上赞成良好的面向对象。

相关问题