繁体   English   中英

检查何时调用List.Add方法

[英]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; }
}

由于方法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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM