2016-01-20 1 views
1

Определено (где DbSet1,2,3 идентичные определения):Могу ли я определить метод .net для принятия параметров с определениями переменных?

Context1 
    DbSet1 
    DbSet2 
    DbSet3 

Context2 
    DbSet1 
    DbSet2 
    DbSet3 

Context3 
    DbSet1 
    DbSet2 
    DbSet3 

Context4 (where DbSet4,5,6 are supersets of DbSet1,2,3) 
    DbSet4 
    DbSet5 
    DbSet6 

Желательно, чтобы выполнять стандартные операции и между контекстами. Это могут быть такие вещи, как Clear, Backup, Load, Seed, Copy и т. Д. Копия используется ниже в качестве примера, где различные наборы данных копируются между контекстами. Четвертый метод ниже немного отличается, потому что Context4 немного отличается от Contexts1,2,3.

Sub Method1 (db1 as Context1, db2 as Context2) 
    Copy_db1_to_db2() 
End 

Sub Method2 (db1 as Context1, db3 as Context3) 
    Copy_db1_to_db3() 
End 

Sub Method3 (db2 as Context2, db3 as Context3) 
    Copy_db2_to_db3() 
End 

Method4 (db1 as Context1, db4 as Context4) 
    Copy_db1_to_db4() 
End 

Можно ли, и если да, то как мы определяем метод так, что различные методы 1,2,3 объединены в единый methodX, который может принимать различные контексты? Мой опыт ограничивается пониманием того, что параметры метода специально объявлены так, что с помощью указанных выше способов, следующий не будет работать:

Method3(Context1,Context3) 

Это не потому, что method3 ожидает, что первый параметр с типом Context2.

Но внутри каждого из методов 1,2,3 код будет идентичным; единственная разница с этими методами - это объявления контекста в определении параметров. Я предполагаю, что существует элегантный способ определить один методX, который позволил бы передавать разные контексты до тех пор, пока ссылки внутри этого метода X согласуются с различными объявлениями контекста.

Метод4 - это немного другая проблема, поскольку Context4 имеет дополнительные таблицы/поля. Но, кроме дополнительных таблиц/полей, оставшаяся часть операций будет обращаться к DbSets 1,2,3. Предполагая, что есть способ сделать то, о чем я прошу, будет также вместить немного другой Context4, если код MethodX остается совместимым со всеми передаваемыми Контекстами?

Добавлено размещать после дальнейших исследований:

Перед выполнением ответа в первом посте ниже я попытался следующим:

Sub Method1 (db1 as Object, db2 as Object) 
    Code that performs the operations 
End 

К не печатая параметры method1 с определенными типами контекстов, он принимает и работает правильно с Контекстами 1-3. Я предполагаю, что если я попытаюсь ссылаться на различия в Context 4, все будет взорваться. Но если у меня есть только код, который работает в Contexts 1-3, это похоже на отличное решение для повторного использования кода в этих различных контекстах с идентичными базами данных, но с разными строками подключения. Я что-то упускаю?

Так что мой следующий вопрос: Является ли эта плохая практика или это законное использование типа «Объект»?

+2

использовать интерфейсы и/или дженерики. – SLaks

+0

Я не совсем понял, что вы имели в виду под дженериками, но, пожалуйста, см. Мое дополнение выше. – Alan

ответ

0

Есть несколько способов сделать это, но один вариант перегружать их:

Sub Method (db1 as Context1, db2 as Context2) 
    Copy_db1_to_db2() 
End 

Sub Method (db1 as Context1, db3 as Context3) 
    Copy_db1_to_db3() 
End 

Sub Method (db2 as Context2, db3 as Context3) 
    Copy_db2_to_db3() 
End 

Sub Method (db1 as Context1, db4 as Context4) 
    Copy_db1_to_db4() 
End 

Если вы хотите иметь общий код, вытаскивать общие биты всех контекстов в интерфейс (скажем, IContext), и иметь закрытый метод, который вызывает перегрузка в общественных местах; что-то вроде

Private Sub Copy (db1 as IContext, db2 as IContext) 
    ... 
End 

и затем

Sub Method (db1 as Context1, db2 as Context2) 
    Copy(db1, db2) 
End 

Sub Method (db1 as Context1, db3 as Context3) 
    Copy(db1, db3) 
End 

Sub Method (db2 as Context2, db3 as Context3) 
    Copy(db2, db3) 
End 

Sub Method (db1 as Context1, db4 as Context4) 
    Copy(db1, db4) 

    ' Custom bits for v4 here 
End