2013-03-26 34 views
1

我是新來的AOP和張貼(2.1.0.0)。我一直在嘗試使用屬性/方法攔截,並且能夠爲我編寫的類編寫inteceptor方面。是否可以使用postharp攔截通用列表上的添加/刪除方法?

我的目標是在編譯之前沒有任何邏輯的列表。

的是我想達到的一個例子是:

public class Foo 
{ 
    //Implementation should throw an exception if more than 1 string added. 
    public List<string> MyList { get; set; } 
} 

有一件事我不知道是列表。我希望能夠在列表中調用Add()或Remove()時運行一些驗證。我想我可以做到這一點,如果我在我自己的自定義列表類中包裝列表並使用aspect屬性裝飾類。

我知道我可以使用我自己的自定義列表來完成此操作,並在我自己的添加/刪除實現中做一些巧妙的事情 - 但這是我希望儘可能避免的。

是否有任何其他(或更好的)攔截這些方法的方法 - 特別是使用post sharp?

回答

1

.NET中沒有一個通用列表的集合更改事件。我知道你不想聽到這個,但是你要麼需要包裝List,要麼需要創建一個實現IList的類。

+0

這很酷 - 我只是想盡量避免它。我知道你可以使用postsharp掛鉤事件(但還沒有探究過) - 所以如果我有一個列表引發事件,你知道是否最好寫方面來獲取這些事件,或者只寫方面攔截添加/刪除? – Jay 2013-03-26 15:07:11

+0

我會寫這個類,實現IList並有一個支持列表來存儲項目(使其簡單)。然後,您可以實施INotifyCollectionChanged並在執行添加/移除/清除時引發事件。請參閱:http://msdn.microsoft.com/en-us/library/ms668629.aspx – 2013-03-26 15:27:51

2

以這種方式無法修改List<T>類,因爲Add方法不是虛擬的。如果MyList屬性返回IList<string>,那麼它返回的對象可以執行此類驗證。

.NET框架提供了Collection<T>類來幫助您擴展某些列表功能。實現您描述的功能的最簡單方法是從中派生一個類並在InsertItem中執行驗證。

Collection<T>類實現IList<string>,所以你仍然需要改變屬性類型Foo.MyList

編輯爲AOP:如果你想使用AOP此功能,而不是從MyList返回一個列表,用戶操作時,Foo類將提供AddRemove方法是在更改之前進行必要的驗證備份列表。在這種情況下,我將返回MyList屬性中的ReadOnlyCollection<T>,以清楚說明該列表只能通過Foo中提供的方法進行處理。

+0

我可以繼承列表並使用'new'關鍵字聲明add()的實現。這是我的驗證 - 如果驗證通過它調用base.add()。這有點討厭,但它的工作原理。那不是我真正想要的。 – Jay 2013-03-26 15:15:19

+1

@Jay不,它不起作用。理解這一點很重要,否則,如果你嘗試了,你將很難追查不可避免的問題。 http://stackoverflow.com/questions/1626049/overriding-listts-add – 2013-03-26 15:19:21

+0

好點 - 感謝您的鏈接,我想我會去包裝名單並將我的方面應用到包裝版本。 – Jay 2013-03-26 15:25:02