2012-06-09 77 views
1

我有一個包裝IEnumerable<T>,幷包含一些額外的邏輯,實現我們稱之爲IMyIterable<T>的接口類型。一方面,我希望人們能使用LINQ方法來過濾和處理IMyIterable<T>(通過實際應用到底層的對象),但另一方面,我還是想流利地暴露IMyIterable<T>的定製實例功能(例如狀態信息)在應用LINQ方法之後。例如簡潔的語法來調用LINQ方法調用後實例方法

var query = myIterable.Select(x => x.whatever); 
//query is now of a completely different type than IMyIterable<T> 
var result = query.MyCustomThingy(); 
//But I really want MyCustomThingy to work too. 

我認識的一個解決辦法是:

var query = myIterable.Linq(x => x.Select(y => y.Whatever)); 

但額外的支架是不體面的我。有沒有其他方法可以做到這一點?我實際上並沒有要求方法Select()返回一個自定義類(儘管如果有完整的方法來做到這一點,例如涉及代碼生成,我肯定會登上),只是一些整潔的語法。

回答

1

LINQ不依賴於IEnumerable的。您可以在IMyIterable本身上實現您需要的LINQ方法(作爲實例方法或作爲擴展方法)。這樣你甚至可以直接在一個IMyIterable類型的變量上使用linq語法。

例如爲:

public interface IMyIterable<T> 
{ 
    IMyIterable<TOut> Select<TOut>(Func<T, TOut> selector); 
    IMyIterable<T> Where(Func<T, bool> predicate); 
    // ... 
} 

這將允許你寫這樣的事情:

IMyIterable<T> source = ...; 

var query = from item in source 
      where item.X == Y 
      select new {...} 
+0

哦!我不知道。不過,儘管如此,我希望我能夠避免必須實施噸和噸的單線。 – GregRos

0

你能否落實IMyIterable方法爲擴展方法IEnumerable的呢?不知道這個接口到底是什麼使得很難提出一個解決方案。

+0

這是不是真的有可能。 'IMyIterable '具有自定義*實例*功能。 – GregRos

0

而是自IEnumerable派生的,你可以創建IMyIterable一堆等效方法(返回IMyIterable),並將其轉發到內部IEnumerable的實例。

然而,這似乎是一個大量的工作去走一走鑄造。我猜你的建議.Linq()解決方案可以正常工作。