我有一个将不同类型的集合公开为属性的类,例如List<Address>
和SortedSet<string>
。我理解集合类应该是只读的,我们不应该公开一个集合进行更新,比如person.Address[3].City = "MyTown"
,或person.EmailAddresses.Add("foo@bar.tld")
。我正在寻找一个 C# 模式来支持这一点。
我的要求有点独特,因为我的类(如本例中的 Person)实现了INotifyPropertyChanged
. 因此,当对这些集合进行更改时,我想在容器对象(人)上触发一个事件以通知客户端应用程序。我知道我们可以使用ObservableCollection<T>,并且SortedSet
有类似这样的示例以及维护排序存储的派生类的示例。我试图避免为使用此 Person 类的其他开发人员在我的项目中添加自定义类 - 我宁愿只公开 CLR 类以减少客户端应用程序操作其他结构的需要,但这不是必需的.
排序存储问题的大多数解决方案是“不存储排序数据,让客户端视图来做”,但这将排序的通用功能留给了使用此类的开发人员,每个人都花时间创建自己的实现采用不同的技术(WPF 组件、LINQ 等)。在此示例中,Person
该类包装了另一个更原始的类,例如,我的SortedSet<string> Email
属性将具有一个创建EMAIL[]
数组的 setter。当序列化该数组时,需要为遗留目的进行排序,并且在对基类型进行排序时,我想公开一个排序的泛型集合。
我还读到你不应该在集合的内容发生变化时引发 PropertyChanged 事件。好吧,在这种情况下,客户端应用程序确实需要知道何时对该对象进行任何类型的更改,并且关于为什么不应该这样做的论点与我们实际需要它的现实不符。
总之,我正在寻找一种一致的 C# 设计模式来修改封装在容器对象中的集合,其中可以对集合进行排序,其中集合元素可能是值类型或引用类型,以及使用此对象的客户端应用程序的位置必须接收所有更改的更改通知。
在这一点上,我倾向于完全用方法来做这件事,为这个Person
类为所有集合类型创建一个一致的 API,以获取整个集合对象,也许作为一个强类型类而不是一个通用 CLR 集合,将实例属性替换为这样一个对象,设置元素并清除它。但我真的宁愿用普通的 getter/setter 来完成所有这些工作。