Наша база данных имеет первичный ключ, определенный для каждой таблицы существующего объединенного ключа с коротким и int. Поэтому, используя Entity Framework, мы можем попытаться найти элемент, вызвав его метод Context.DbSet<>.Find(params object[] parameters)
. В нашем коде это будет выглядеть так:Как перегрузить метод, который имеет объект params [] как параметр
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 также соответствует исходным параметрам, что приводит к исключению. Как мы можем решить эту проблему?
[Ближе лучше] (http://ericlippert.com/2013/12/23/closer-is-better/) Переименовать ваш метод расширения. Это единственное, о чем я могу думать. Или назовите его как «Extensions.Find» вместо –
, потому что он принимает ваш объект в свой объект [], почему бы не изменить имя добавочного имени, как FindCustom –