Как перегрузить метод, который имеет параметр 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;
}