Как перегрузить метод, который имеет параметр params object[] в качестве параметра

Наша база данных имеет первичный ключ, определенный для каждой таблицы, существующей из комбинированного ключа с коротким и целым числами. Поэтому, используя Entity Framework, мы можем попытаться найти элемент, вызвав его Context.DbSet<>.Find(params object[] parameters) метод. В нашем коде это будет выглядеть так:

public Client FindClient(short sqlId, int incId)
{
  Context db = new Context();
  Client result = db.Clients.Find(sqlId, incId);
  return result;
}

Однако в нашем коде мы используем структуры для хранения значений ключей. Наша структура выглядит следующим образом:

public struct DbKey
{
  private short _SqlId;
  private int _IncId;
  public short SqlId { get { return _SqlId; } }
  public int IncId { get { return _IncId; } }

  public DbKey(short SqlId, int IncId)
  {
    this._SqlId = SqlId;
    this._IncId = IncId;
  }

и имеет некоторые другие методы сравнения и т. д. Мы хотели бы иметь возможность вызывать метод DbSet.Find следующим образом:

public Client FindClient(DbKey key)
{
  Context db = new Context();
  Client result = db.Clients.Find(key);
  return result;
}

Чтобы сделать это, мы написали перегрузку расширения для этого метода:

public static partial class Extensions
{
  public static T Find<T>(this DbSet<T> dbset, DbKey key) where T : class
  {
    return dbset.Find(key.IncId, key.SqlId);
  }
}

Intellisense теперь сообщает нам, что метод Find перегружен, при этом одна из версий принимает DbKey key в качестве параметра, а другой, оригинальный метод, принимающий params object[] parameters, Однако при выполнении кода функция всегда будет вызывать исходный метод, а не перегруженный, поскольку DbKey также соответствует исходным параметрам, что приводит к исключению. Как мы можем решить эту проблему?

1 ответ

Решение

Ну, вы можете переименовать или вызвать статическое расширение напрямую:

public Client FindClient(DbKey key)
{
  Context db = new Context();
  Client result = Extensions.Find(db.Clients, key);
  return result;
}
Другие вопросы по тегам