我需要一个具有可共享行为的项目列表。
示例:
Person class
有List<PhoneNumber>
只有一个PhoneNumber
是bool IsPrimary
其他项目相同
有List<EmailAddress>
有List<Address>
想象一下,每个项目(PhoneNumber
,EmailAddress
,Address
)共享相同的接口ICanBePrimary
,其中包含一个属性bool IsPrimary
的要求以及List<ICanBePrimary>
列表中只有一个项目可以具有IsPrimary
的真值。
答案 0 :(得分:3)
最干净的方法是隐藏一个允许您枚举内容的类后面的列表,并提供其他方法来识别主要项目:
class AddressList : List<Address> {
private int indexOfPrimaryAddress = 0;
public Address PrimaryAddress {
get {
return this[indexOfPrimaryAddress];
}
set {
indexOfPrimaryAddress = this.IndexOf(value);
}
}
// Override more methods to make sure that the index does not become "hanging"
}
更清晰的实现会将列表封装在AddressList
类中,并且只公开您想要公开的方法:
class AddressList : IList<Address> {
private int indexOfPrimaryAddress = 0;
private readonly IList<Address> actualList = new List<Address>();
// Implement the List<Address> by forwarding calls to actualList
}
答案 1 :(得分:2)
您可以创建自己的专门收藏类,其中包含主要项目的概念。
这样的事情:
public class ListWithPrimary<T> : List<T> {
public bool HasPrimary { get; private set; }
private T primary;
public T Primary
{
get
{
return primary;
}
set
{
if (!Contains(value)) throw new Exception();
primary = value;
}
}
public void AddPrimary(T item)
{
Add(item);
primary = item;
HasPrimary = true;
}
public void ClearPrimary() {
primary = default(T);
HasPrimary = false;
}
....
}
(请注意,上述内容仍然不完整。您必须保持主要项始终是列表的一部分的不变量。)
答案 2 :(得分:0)
重新发布已删除的内容...... 我们都看到......问题不够清楚,需要澄清...... 但仍然......我回答了这个问题,假设所有答案都是&#34;是&#34;。 仍然是该问题的作者标记了我的删除帖子......和版主尽管另一个人不同意作者,但是它确实没有。
我们需要更多信息。
您是否在Person,EmailAddress和Address类中使用或可以使用INotifyPropertyChanged?
您真的要求IsPrimary属性成为您的类的一部分吗?
如果您这样做
然后您可以在项目上侦听所有PropertyChanged事件(属于该界面的一部分)并拦截对IsPrimary的更改,然后您将检查它是否切换为ON然后在所有其他项目上切换IsPrimary关闭。
请记住,这是实现您所要求的行为的正确方法。是的,这是正确的答案。
PS。如果您只对&#34; CurrentItem&#34;感兴趣,您也可以使用CollectionView类。行为。