[英]Do a check when List.Add method is called
我有一个名为List的Items类型的复合属性,用于订购类。 用户在GUI上填写一些字段,例如名称,说明,价格,数量等...,然后单击“添加项目”按钮,该按钮当然会将项目添加到订单的项目列表中。 我想做的是创建一个检查项目的IsComplete属性的方法,该方法进行检查以确保设置了必需的属性,从而使某人不能只是调用order.Items.Add(item)(如果没有)完成。 如果不是,那么我希望该项目的IsComplete属性返回false时引发异常。什么是简单的方法?
这可以通过将List<T>
子类化为派生类,然后像上面那样重写Add
方法来实现。
public class MyItemCollection : List<MyItem>
{
public override void Add(MyItem item)
{
if (item.IsComplete)
{
base.Add(item);
}
else
{
throw new InvalidOperationException("Unable to add an incomplete item");
}
}
}
这样,您的订单类将具有MyItemCollection
属性,而不是List<T>
,如下所示:
public class Order
{
public MyItemCollection Items { get; set; }
}
您也可以使用ObservableCollection<T>
: http : //msdn.microsoft.com/zh-cn/library/ms668604.aspx
它实现了INotifyCollectionChanged
: http : //msdn.microsoft.com/zh-cn/library/System.Collections.Specialized.INotifyCollectionChanged.aspx
由于方法Add(T)
不是虚拟的,因此无法覆盖它。
ObservableCollection允许在添加元素时引发事件,但不能撤消此添加。
您可以使用内部存储有List<T>
IList<T>
接口实现接口,并在调用_list.Add(item)
之前,在方法Add(T item)
所需的验证,如下例所示:
public class MyItemCollection : IList<MyItem>
{
private List<MyItem> _list;
public MyItemCollection()
{
_list = new List<MyItem>();
}
public void Add(MyItem item)
{
if (item.IsComplete)
{
_list.Add(item);
}
else
{
throw new InvalidOperationException("Unable to add an incomplete item");
}
}
//Then you have to implement all the IList interface members...
}
该解决方案的唯一问题是,它需要编写很多样板代码。
如果只有一个类负责操作List
,则还可以决定在负责的类中实现方法AddToMyItemCollection(MyItem item)
。 考虑到GRASP模式保护的变体 (甚至比Instance.getA()。getB()。getC()更可取),因此它甚至是一个很好的实用工具。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.