2012-10-18 75 views
1

我有一個名爲IFilterDataSourceAdapter的接口。此接口公開端點以適應輸入數據源(IEnumrable<T>,iCollectionViewDataTableDataViewXmlDocument),並提供直觀地過濾它們的功能。類別和功能選擇性泛型

  1. 它接受數據源中字段的名稱。
  2. 主要生產的FilterFields列表中的每個暴露三個屬性

    1. 名稱基於字段的Type
    2. 的濾波器算表的字段 - 等於,包含,小於等
    3. 提供價值領域。

    圖形用戶界面可以使用此FilterField列表來顯示過濾器面板。

  3. 適配器將提供自己的ICommand以從GUI執行過濾器調用。

所以在THW適配器,我想要做以下

  1. 如果傳入的數據源是IEnumrable<SomeClass>類型時,應用濾鏡我會產生AsQueryable()LINQ表達式和揭露查詢IEnumrable<SomeClass>列表回來。
  2. 如果傳入的數據源是ICollectionView類型,我會生成Filter委託並刷新集合視圖。
  3. 如果傳入的數據源類型爲DataTableDataView我會生成DataFilter基於字符串的查詢並刷新數據表或數據視圖。
  4. 如果傳入的數據源是XDocument類型,則會生成XPath表達式和XElements過濾的列表。

我想根據Generics約束於上述類型的數據源,並相應的Filter命令執行之間還區分做到這一點。

我們可以有一個單一的接口IFilterDataSourceAdapter<T>被約束爲基於在T其成員(字段和函數)是要麼IEnurable<SomeClass>ICollectionViewDataTableDataViewXDocument

編輯:

我目前的實現實際上是5種每種類型的數據源的asbtract適配器和他們工作的罰款。他們全部實施IFilterDataSourceAdapter。但是我認爲可能是我們可以制定具有約束條件的IFilterDataSourceAdapter<T>,而不是更適合每個適配器實現方式的設計。所以可能是我已經很好了。

可能是我超越了事物!

回答

1

可能不是一個答案,但太長的評論...基於我對你的問題的理解,我會說你現在擁有什麼(共同的基礎接口與不同的接口,每個特定於數據源)是好的。

我特別提到你的問題的這部分:

我們能有一個基於在T 是要麼IEnurable<SomeClass>ICollectionView一個單一的界面IFilterDataSourceAdapter<T>被 約束其成員(字段和函數)或DataTableDataViewXDocument

如果您的「通用」接口應該根據其通用參數T的類型指定不同的實現,那麼接口實際上並不是通用的,是嗎?

對於泛型,您應該抽象出不同類型共有的行爲,而限制應該只允許您更精確地定義您定義此常見行爲的不同類型的集合。