이 질문에 대한 대답과 관련하여 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(); }
또한 반환 값을 고려하는 유용한 일반 대리자가 있습니다.
방법:
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