[c#] Action ()에서 값을 반환하는 방법은 무엇입니까?

이 질문에 대한 대답과 관련하여 DataContext를 Action ()에 전달하면 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.
});



답변

정적 메서드는 다음에서 이동해야합니다.

public static class SimpleUsing
{
    public static void DoUsing(Action<MyDataContext> action)
    {
        using (MyDataContext db = new MyDataContext())
           action(db);
    }
}

에:

public static class SimpleUsing
{
    public static TResult DoUsing<TResult>(Func<MyDataContext, TResult> action)
    {
        using (MyDataContext db = new MyDataContext())
           return action(db);
    }
}

이 답변은 주석에서 나왔기 때문에 코드를 제공 할 수있었습니다. 자세한 내용은 아래 @sll의 답변을 참조하십시오.


답변

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());


답변

람다 또는 익명 메서드가 둘러싸는 범위의 변수를 닫을 수 있다는 사실을 활용할 수도 있습니다.

MyType result;

SimpleUsing.DoUsing(db =>
{
  result = db.SomeQuery(); //whatever returns the MyType result
});

//do something with result


답변

사용 Func<T>보다는 Action<T>.

Action<T>매개 변수가 T 유형 인 void 메서드 Func<T>처럼 작동 하는 반면 매개 변수가없고 T 유형의 객체를 반환하는 함수처럼 작동합니다.

함수에 매개 변수를 제공하려면을 사용하십시오 Func<TParameter1, TParameter2, ..., TReturn>.


답변