Подтвердить что ты не робот

Как вернуть значение из 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.
}); 
4b9b3361

Ответ 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>.