C#赋值的正确模式,对象的属性是集合

时间:2014-09-17 18:37:19

标签: c# design-patterns observablecollection inotifypropertychanged inotifycollectionchanged

我有一个类,它将不同类型的集合公开为属性,例如List<Address>SortedSet<string>。我理解collection classes should be read-only,我们不应公开更新集合,例如person.Address[3].City = "MyTown"person.EmailAddresses.Add("foo@bar.tld")。我正在寻找一种C#模式来支持这一点。

我的要求有点独特,因为我的类(例如本例中的Person)实现了INotifyPropertyChanged。因此,当对这些集合进行更改时,我想在容器对象(person)上触发事件以通知客户端应用程序。我知道我们可以使用ObservableCollection<T>,而对于SortedSet,有一些例如thisthis的派生类可以维护已排序的存储空间。我试图避免为使用此Person类的其他开发人员向我的项目添加自定义类 - 我更喜欢仅公开CLR类以减少客户端应用程序操纵其他结构的需要这不是必需的。

排序存储问题的大多数解决方案都不会存储已排序的数据let the client view do it&#34;但是这会将排序的常见功能留给正在使用此类的开发人员,每个人都花时间在不同的技术(WPF组件,LINQ等)中创建自己的实现。在这个例子中,Person类包装了另一个更原始的类,例如我的SortedSet<string> Email属性将有一个创建EMAIL[]数组的setter。当序列化时,该数组需要为传统目的排序,并且基类型被排序的位置我希望公开已排序的泛型集合。

我也读过you should not raise the PropertyChanged event when the contents of the collection change。那么,在这种情况下,客户端应用程序确实需要知道何时对此对象进行任何类型的更改,以及关于为什么不应该这样做的争论不同意我们实际需要它的现实。< / p>

总之,我正在寻找一致的C#设计模式来修改封装在容器对象中的集合,其中集合可能被排序,集合元素可能是值类型或引用类型,以及使用此对象的客户端应用程序必须接收所有更改的更改通知。

此时我倾向于完全使用方法执行此操作,为所有集合类型的此Person类创建一致的API,以使整个集合对象可能作为强类型类而不是作为通用CLR集合,用这样的对象替换实例属性,设置元素并清除它。但我真的宁愿用普通的getter / setter来做所有这些。

0 个答案:

没有答案