如何从Action()返回值?


92

关于将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.
}); 

Answers:


97

您的静态方法应来自:

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答案。


113

您可以使用Func<T, TResult>通用委托。(请参阅MSDN

Func<MyType, ReturnType> func = (db) => { return new MyType(); }

还有一些有用的泛型委托考虑了返回值:

  • Converter<TInput, TOutput>MSDN
  • Predicate<TInput>-总是返回布尔(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());

正确-您可以提供该方法的样例吗?
2011年

5
@LB-向人们询问Google并不是建设性的。存在SO可以提供完整的答案。
Kirk Woll

5
@KirkWoll但答案给出的成分,它并没有被煮熟
LB

9
@LB-最好完整些。我发现您的比喻是虚假的。
Kirk Woll

1
@LB,最好不要发表评论,因为您从未添加任何价值。
2011年

15

您还可以利用以下事实:lambda或匿名方法可以在其封闭范围内关闭变量。

MyType result;

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

//do something with result

是的,这被称为Closure(也可供我们使用的基本语言资料)
sll

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.