Как вернуть значение из Action()?
Что касается ответа на этот вопрос Передача DataContext в Action(), как мне вернуть значение из действия (db)?
SimpleUsing.DoUsing(db => {
// do whatever with db
});
Должно быть больше похоже:
MyType myType = SimpleUsing.DoUsing<MyType>(db => {
// do whatever with db. query buit using db returns MyType.
});
Ответы
Ответ 1
Ваш статический метод должен идти от:
public static class SimpleUsing
{
public static void DoUsing(Action<MyDataContext> action)
{
using (MyDataContext db = new MyDataContext())
action(db);
}
}
To:
public static class SimpleUsing
{
public static TResult DoUsing<TResult>(Func<MyDataContext, TResult> action)
{
using (MyDataContext db = new MyDataContext())
return action(db);
}
}
Этот ответ вырос из комментариев, чтобы я мог предоставить код. Для полной разработки см. Ниже ответ @sll.
Ответ 2
Вы можете использовать общий делегат Func<T, TResult>
. (См. MSDN)
Func<MyType, ReturnType> func = (db) => { return new MyType(); }
Также есть полезные обобщенные делегаты, которые учитывают возвращаемое значение:
-
Converter<TInput, TOutput>
(MSDN) -
Predicate<TInput>
- всегда возвращать bool (MSDN)
Метод:
public MyType SimpleUsing.DoUsing<MyType>(Func<TInput, MyType> myTypeFactory)
Общий делегат:
Func<InputArgumentType, MyType> createInstance = db => return new MyType();
Выполнение:
MyType myTypeInstance = SimpleUsing.DoUsing(
createInstance(new InputArgumentType()));
ИЛИ явно:
MyType myTypeInstance = SimpleUsing.DoUsing(db => return new MyType());
Ответ 3
Вы также можете воспользоваться тем фактом, что метод лямбда или анонимный может закрывать переменные в своей охватывающей области.
MyType result;
SimpleUsing.DoUsing(db =>
{
result = db.SomeQuery(); //whatever returns the MyType result
});
//do something with result
Ответ 4
Используйте Func<T>
вместо Action<T>
.
Action<T>
действует как метод void с параметром типа T, в то время как Func<T>
работает как функция без параметров и возвращает объект типа T. Если вы хотите задать параметры своей функции, используйте Func<TParameter1, TParameter2, ..., TReturn>
.