2

我有一个看起来像这样的接口合同:

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 上)。

那么,我该如何克服呢?

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

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

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

4

2 回答 2

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);
于 2010-09-07T02:13:03.547 回答
1

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

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);
于 2010-09-07T01:13:23.407 回答