2014-11-13 2 views
0

Наша база данных имеет первичный ключ, определенный для каждой таблицы существующего объединенного ключа с коротким и 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 также соответствует исходным параметрам, что приводит к исключению. Как мы можем решить эту проблему?

+0

[Ближе лучше] (http://ericlippert.com/2013/12/23/closer-is-better/) Переименовать ваш метод расширения. Это единственное, о чем я могу думать. Или назовите его как «Extensions.Find» вместо –

+0

, потому что он принимает ваш объект в свой объект [], почему бы не изменить имя добавочного имени, как FindCustom –

ответ

1

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

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

. Чтобы уточнить: правила метода расширения специально игнорируют метод расширения, если есть не -extension, который соответствует сайту вызова, даже если перегрузка обычно предпочитает метод расширения. Метод расширения не является _really_ перегрузкой, потому что он не является фактически одним и тем же типом. Вызов его явно устраняет двусмысленность, заставляя неперегруженный метод из класса класса расширения использоваться. –

Смежные вопросы