c# – 适用于IEnumerable和IQueryable的扩展方法?
发布时间:2020-12-15 04:15:15 所属栏目:百科 来源:网络整理
导读:我想要一个适用于我的List和IQueryable的扩展方法.下面的扩展方法实现了这一点,但是如果我添加另一个相同的扩展方法,但是在一个不同的完全不相关的类型上我得到了模糊的调用 编译错误.这是为什么?编译器是否足够聪明,无法知道哪种扩展方法有效?我的意思是,
我想要一个适用于我的List和IQueryable的扩展方法.下面的扩展方法实现了这一点,但是如果我添加另一个相同的扩展方法,但是在一个不同的完全不相关的类型上我得到了模糊的调用
编译错误.这是为什么?编译器是否足够聪明,无法知道哪种扩展方法有效?我的意思是,这些调用中只有一个是有效的,为什么编译器不能告诉?非常感谢! class ClassA { public bool IsActive{ get; set;} } class ClassB { public bool IsActive { get; set;} } // then here are my extensions public static T IsActive<T>(this T enumerableOrQueryable,bool isActive) where T : IEnumerable<ClassA> { return (T)enumerableOrQueryable.Where(x => x.IsActive == isActive); } public static T IsActive<T>(this T enumerableOrQueryable,bool isActive) where T : IEnumerable<ClassB> { return (T)enumerableOrQueryable.Where(x => x.IsActive == isActive); } 解决方法
重载规则没有考虑它正在考虑的方法的约束 – 它确定哪个重载是最好的,然后验证约束匹配.
编译器完全遵循C#规范的规则. 相关博文: > Overloading and generic constraints(我) 编辑:请注意,使用“enumerableOrQueryable”总是将lambda表达式转换为委托,而不是表达式树.因此,如果您希望它以不同的方式为数据库执行逻辑,那么无论如何都需要进行更改. 编辑:你的想法也行不通,因为你无论如何都不会得到相同的结果类型 – 如果你在列表上调用Where< string>,则返回的值不是List< string>. 如果您可以引入由ClassA和ClassB实现的新接口,那么您可以做到这一点: public static IQueryable<T> IsActive<T>(this IQueryable<T> source,bool isActive) where T : ICanBeActive { // Lambda converted to an expression tree return source.Where(x => x.IsActive == isActive); } public static IEnumerable<T> IsActive<T>(this IEnumerable<T> source,bool isActive) where T : ICanBeActive { // Lambda converted to a delegate return source.Where(x => x.IsActive == isActive); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 在ruby中按值删除ONE数组元素
- uploadify,swfupload等flash上传session丢失问题,无法接收
- 小白使用React---ajax请求成功后跳转到另一个页面
- c – “错位地址错误”是什么意思?
- 命名空间“System.Data”中不存在类型或命名空间名称“SQLi
- ACE反应器(Reactor)模式
- 对我这个程序员来说,国庆后的又一大喜讯,PostgreSQL 10发
- Flex4 + WebService + Oracle10g写的登录程序
- ruby-on-rails – 如何在rails路由中动态切换子域和命名空间
- postgresql – Autovacuum未在Openshift Online Postgres盒