我有一个类,它将不同类型的集合公开为属性,例如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
,有一些例如this和this的派生类可以维护已排序的存储空间。我试图避免为使用此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来做所有这些。