У меня проблема с некоторыми перегруженными методами, и я постараюсь дать простую реализацию этого.
Итак, вот класс, содержащий два метода ниже:
public class MyRepo<TEntity>
{
public List<TEntity> GetData(Expression<Func<TEntity, Boolean>> expression)
{
//Do something
}
public List<TEntity> GetData(Func<TEntity,Boolean> whereClause)
{
//Do something
}
}
а это моя сущность:
public class MyEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
Вот где я его использую:
{
...
MyRepo<MyEntity> myRepo = new MyRepo<MyEntity>();
myRepo.GetData(x => x.Id == 1); // The ambiguity point
...
}
Проблема в том, что у меня просто есть два метода с одинаковыми именами и разными аргументами, поэтому, исходя из концепций ООП-полиморфизма, я ожидаю, что .NET поймет мой нужный метод.
Но это очевидно .NET не может понять это, потому что формы экземпляров Expression<Func<TEntity, Boolean>>
и Func<TEntity, Boolean>
одинаковы, и это ошибка времени компиляции, которая возникает .NET:
The call is ambiguous between the following methods or properties:
'Program.MyRepo<TEntity>.GetData(Expression<Func<TEntity, bool>>)' and
'Program.MyRepo<TEntity>.GetData(Func<TEntity, bool>)'
Вопрос: как я могу предотвратить эту ошибку во время компиляции?
Я предпочитаю не трогать способ, которым я звоню GetData()
в этой строке:
myRepo.GetData(x => x.Id == 1);