2015-03-13 6 views
0

У меня есть общая инкапсуляция, которую я использовал в своих контроллерах для обработки передачи предупреждений, исключений и регистрации ошибок. Вот простая версия этого:Как создать метод, который возвращает действие с ограниченным параметром?

private void ActionHelper(Action<SpecificDbContext> DatabaseActions) 
{ 
    try { 
     DatabaseActions(db); 
    } 
    catch (Exception ex) { 
     // error handling 
    } 
} 

Это делает его таким образом, я могу просто определить взаимодействие с базой данных в анонимной функции и передать его, и он обрабатывает все другие вещи. Мне нужно создать этот ActionHelper на каждом контроллере, поскольку каждый из них использует другой DbContext - я бы хотел его обобщить.

Что мне нужно - это метод, в котором я могу передать тип (который реализует DbContext) и вернуть его выше. Я полагаю, подпись будет выглядеть примерно так:

public Action<T where T : DbContext> Builder(Type type) 

и я хотел бы использовать это что-то вроде этого:

Action<SpecificDbContext> ActionHelper = Builder(typeof(SpecificDbContext)); 

Как я должен построить этот метод, который возвращает действия?

ответ

1

Я подозреваю, что вы просто хотите:

public Action<T> Builder<T>() where T : DbContext 

Тогда вы могли бы назвать его как:

Action<SpecificDbContext> actionHelper = Builder<SpecificDbContext>(); 

Вам не нужно type аргумент, как и в методе вы можете использовать typeof(T). Но:

  • Вам нужно сделать это универсальный метод, который означает, поставив параметр типа после имени метода
  • В отличие от Java, где ограничение указанного в том же месте в качестве параметра типа, в C# ограничения идут в конце описания класса или метода
+0

Спасибо, ваш ответ мне помог. Я думаю, что ваша подпись вернет действие, которое принимает параметр DbContext как параметр, хотя мне нужно, чтобы он возвращал действие, которое принимает действие как параметр. Я думаю, что, может быть, подпись должна выглядеть следующим образом: «открытые статические Action > Builder (), где T: DbContext» Но писать тело метода начинает болеть мою голову. Как, черт возьми, я получаю разрывы строк в комментариях? – cspyr0

+0

@cspyro: Правильно, может быть. Я шел только подписи, которую вы получили. К сожалению, я не уверен, что смогу помочь вам написать этот метод, кроме как сказать, что лямбда-выражения, вероятно, ваши друзья ... –

+0

Хорошо, спасибо за помощь. – cspyr0

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