调用LINQ方法后调用实例方法的简明语法

时间:2012-06-09 13:13:19

标签: c# linq extension-methods

我有一个包装IEnumerable<T>并包含一些额外逻辑的类型,实现了一个我们称之为IMyIterable<T>的接口。一方面,我希望人们使用LINQ方法来过滤和处理IMyIterable<T>(实际上将它们应用于底层对象),但另一方面,我仍然想要流利地公开IMyIterable<T>的应用LINQ方法后,自定义实例功能(例如状态信息)。 e.g。

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()返回一个自定义类(尽管有很多方法可以做到这一点,例如涉及代码生成,我肯定是在船上),只是一些更整洁的语法。

3 个答案:

答案 0 :(得分:1)

LINQ与IEnumerable无关。您可以在IMyIterable本身上实现所需的LINQ方法(作为实例方法或扩展方法)。这样,您甚至可以直接在类型为IMyIterable的变量上使用linq语法。

E.g:

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 {...}

答案 1 :(得分:0)

您可以将IMyIterable上的方法实现为IEnumerable的扩展方法吗?不知道这个界面究竟是什么使得很难找到解决方案。

答案 2 :(得分:0)

您可以在IMyIterable上创建一堆等效方法(返回IMyIterable)并将它们转发到内部IEnumerable实例,而不是从IEnumerable派生。

然而,这似乎需要做很多工作才能解决问题。我想你建议的.Linq()解决方案可行。