У меня есть контракт интерфейс, который выглядит следующим образом:Выражение <Func<T,bool>> - Как обрабатывать неоднозначные подписи?
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 Призыва» ошибки, которые отчасти имеет смысл, потому что свойство «UserId» существует на абстрактном «FooBar "(и, следовательно, существует и на Foo и Bar).
Итак, как я могу это преодолеть?
Мне нравится внешний вид моего интерфейса (перегруженные методы предикатов), как с точки зрения intellisense из вызывающего кода, существует только одно имя метода.
Почему у меня есть мой интерфейс? Ну, некоторые сценарии я хочу вернуть только «Foo» или «Bar», иногда мне нужен смешанный пакет, поэтому мне нужно вернуть абстрактный тип - смысл?
В любом случае, на очевидный вопрос - есть ли способ обойти это? (кроме переименования моих методов интерфейса)? (и, таким образом, скомпрометируя простоту)
просто была мысль - Есть ли способ создать классы, которые происходят из Expression> и использовать их в моей сигнатуре интерфейса? (и, таким образом, решение проблемы двусмысленности)? –
RPM1984
Выражение/Func - это запечатанные классы, dang. Im в убытке здесь! – RPM1984