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