表达<FUNC <t时,布尔>&GT; - 如何处理不明确的方法签名?</func <t,bool>

时间:2010-09-07 00:35:43

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

我有一个接口合约,如下所示:

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);

它正在获得“Ambigious invocation”错误,这是有道理的,因为属性“UserId”存在于抽象的“FooBar”类型上(因此也存在于Foo和Bar上)。

那么,我怎么能克服这个?

我喜欢我的界面外观(重载的谓词方法),从智能调查的角度来看,只有一个方法名称。

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

无论如何,对于这个显而易见的问题 - 有没有办法解决这个问题? (除了重命名我的界面方法)? (从而损害了简单性)

2 个答案:

答案 0 :(得分:1)

您可以在lambda中声明f的类型,而不是推断它。这样,只有一个重载适用。

var foo = myService.FindByPredicate((Foo f) => f.UserId == 1);
var bar = myService.FindByPredicate((Bar f) => f.UserId == 1);
var foobar = myService.FindByPredicate((FooBar f) => f.UserId == 1);

答案 1 :(得分:1)

您可以将方法声明为通用方法,然后只需要一种方法:

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

然后你可以这样称呼它:

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