c# - Expression<Func<T,bool>> - 如何处理不明确的方法签名?

标签 c# linq abstract-class predicate linq-expressions

我有一个看起来像这样的接口(interface)契约:

ICollection<FooBar> FindByPredicate(Expression<Func<FooBar,bool>> predicate);
ICollection<Foo> FindByPredicate(Expression<Func<Foo,bool>> predicate);
ICollection<Bar> FindByPredicate(Expression<Func<Bar,bool>> predicate);

Foo 和 Bar 是继承自 FooBar 抽象类的具体类。

现在,我在尝试调用这些方法时遇到了问题:

var foo = myService.FindByPredicate(f => f.UserId == 1);

出现“模糊调用”错误,这是有道理的,因为属性“UserId”存在于抽象“FooBar”类型中(因此也存在于 Foo 和 Bar 中)。

那么,我该如何克服呢?

我喜欢我的接口(interface)(重载谓词方法)的外观,因为从调用代码的智能感知角度来看,只有一个方法名称。

为什么我的界面是那样的?好吧,有些场景我希望只返回“Foo”或“Bar”,其他时候我需要一个混合包,因此我需要返回抽象类型 - 有意义吗?

无论如何,回到一个明显的问题 - 有没有办法解决这个问题? (除了重命名我的接口(interface)方法)? (因此损害了简单性)

最佳答案

你可以声明方法是通用的,然后你只需要一个方法:

public interface IFooBarService
{
    ICollection<T> FindByPredicate<T>(Expression<Func<T, bool>> predicate)
        where T : FooBar;
}

然后你可以这样调用它:

var foo = myService.FindByPredicate<Foo>(f => f.UserId == 1);

关于c# - Expression<Func<T,bool>> - 如何处理不明确的方法签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655051/

相关文章:

c# - Crystal 报表中的重复行

c# - 如何以 “12”的格式显示数字 “0000012”

php - 如何实例化抽象类的子单例?

c# - 我们可以使用抽象类而不是接口(interface)吗

java - Eclipse 无法解析抽象类类型的复合组件属性

c# - Windbg 使用 TryGetValue 从字典中获取值

c# - Windows 窗体的更新 - C#

c# - 替换 ObservableCollection<T> 中的项目时出现 ArgumentOutOfRangeException

C# linq层次结构树

c# - .FirstOrDefault() 在非空 IQueryable 上返回 null