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


94

이 질문에 대한 대답과 관련하여 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.
}); 

답변:


99

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

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의 답변을 참조하십시오.


114

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

맞습니다-방법이 어떻게 생겼는지에 대한 예를 제공 할 수 있습니까?
4thSpace

6
@LB-사람들에게 Google에 요청하는 것은 건설적이지 않습니다. 그래서 완전한 답변을 제공하기 위해 존재합니다.
Kirk Woll 2011

5
@KirkWoll 그러나 대답은 재료를 제공합니다 , 그것은 요리
LB

9
@LB-완성하는 것이 좋습니다. 나는 당신의 비유가 가짜라고 생각합니다.
Kirk Woll 2011

1
@LB, 가치를 추가하지 않기 때문에 코멘트하지 않는 것이 좋습니다.
4thSpace

15

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

MyType result;

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

//do something with result

그래,이은 (뿐만 아니라 우리를 위해 사용할 수 있습니다 funcitonal 언어 물건) 폐쇄라고
SLL

4

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.