C# 调用LINQ方法后调用实例方法的简明语法
我有一个类型,它包装了一个C# 调用LINQ方法后调用实例方法的简明语法,c#,linq,extension-methods,C#,Linq,Extension Methods,我有一个类型,它包装了一个IEnumerable,并包含一些额外的逻辑,实现了一个我们称之为IMyIterable的接口。一方面,我希望人们使用LINQ方法来过滤和处理IMyIterable(通过将它们实际应用到底层对象),但另一方面,我仍然希望在应用LINQ方法后,能够流畅地公开IMyIterable的自定义实例功能(例如状态信息)。e、 g var query = myIterable.Select(x => x.whatever); //query is now of a compl
IEnumerable
,并包含一些额外的逻辑,实现了一个我们称之为IMyIterable
的接口。一方面,我希望人们使用LINQ方法来过滤和处理IMyIterable
(通过将它们实际应用到底层对象),但另一方面,我仍然希望在应用LINQ方法后,能够流畅地公开IMyIterable
的自定义实例功能(例如状态信息)。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.
但是额外的括号对我来说不合适。我还有别的办法吗?实际上,我并不是要求方法
Select()
返回一个自定义类(尽管如果有很好的方法可以实现这一点,例如涉及代码生成,我肯定会支持),只是一些更简洁的语法 您能否将IMyIterable上的方法改为IEnumerable的扩展方法?由于不知道该接口的具体功能,因此很难找到解决方案。您能否将ImyInterable上的方法实现为IEnumerable的扩展方法?由于不知道该接口的具体功能,因此很难找到解决方案。您可以在IMyIterable(返回IMyIterable)上创建一组等效方法,而不是从IEnumerable派生,然后将它们转发到内部IEnumerable实例
然而,这似乎是一个演员周围的很多工作。我想您建议的.Linq()解决方案可以正常工作。您可以在IMyIterable(返回IMyIterable)上创建一组等价的方法,而不是从IEnumerable派生,然后将它们转发到内部IEnumerable实例
然而,这似乎是一个演员周围的很多工作。我想您建议的.Linq()解决方案可以使用。Linq与IEnumerable没有关联。您可以在IMyIterable本身上实现所需的LINQ方法(作为实例方法或扩展方法)。这样,您甚至可以直接在IMyIterable类型的变量上使用linq语法 例如:
公共接口不可交互
{
不可交互选择(功能选择器);
不可替换的Where(Func谓词);
// ...
}
这将允许您编写如下内容:
IMyIterable<T> source = ...;
var query = from item in source
where item.X == Y
select new {...}
imyiterablesource=。。。;
var query=来自源中的项
其中item.X==Y
选择新{…}
LINQ不与IEnumerable绑定。您可以在IMyIterable本身上实现所需的LINQ方法(作为实例方法或扩展方法)。这样,您甚至可以直接在IMyIterable类型的变量上使用linq语法
例如:
公共接口不可交互
{
不可交互选择(功能选择器);
不可替换的Where(Func谓词);
// ...
}
这将允许您编写如下内容:
IMyIterable<T> source = ...;
var query = from item in source
where item.X == Y
select new {...}
imyiterablesource=。。。;
var query=来自源中的项
其中item.X==Y
选择新{…}
这是不可能的<代码>IMyIterable具有自定义实例功能。这实际上是不可能的<代码>IMyIterable具有自定义实例功能。哦!我不知道。尽管如此,我还是希望我能以某种方式避免实现大量的一行程序!我不知道。尽管如此,我还是希望我能以某种方式避免实现大量的一行程序。
IMyIterable<T> source = ...;
var query = from item in source
where item.X == Y
select new {...}