2012-04-28 55 views
0

我有一個叫做List類型的Items的組合屬性給一個Order類。在GUI上,用戶填寫一些字段,如名稱,說明,價格,數量等......然後單擊添加項目按鈕,這當然會將項目添加到訂單的項目列表中。我想要做的是創建一個方法來檢查項目的IsComplete屬性,該屬性執行檢查以確保設置所需的屬性,以便某人不能僅僅調用order.Items.Add(item)(如果它不是)完成。如果不是,我想要一個異常被拋出,如果該項目的IsComplete屬性返回false ...什麼是一個簡單的方法來解決這個問題?當List.Add方法被調用時做一個檢查

回答

1

這可以通過將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; } 
} 
+0

正是我在找的東西。謝謝! – 2012-04-28 15:11:14

0

由於方法Add(T)是不是虛擬的,你不能重寫,它。

ObservableCollection允許在添加元素時拋出事件,但不能撤消此添加。

可以實現接口IList<T>與internaly storred一個List<T>和方法Add(T item)調用_list.Add(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模式protected variation(Instance.getC()優於Instance.getA()。getB()。getC())

相關問題