如何从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. });
你的静态方法应该从:
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 MyTytpe(); }
还有一些有用的通用代表,它们会考虑返回值:
-
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());
您也可以利用lambda或匿名方法可以closures其封闭范围中的variables的事实。
MyType result; SimpleUsing.DoUsing(db => { result = db.SomeQuery(); //whatever returns the MyType result }); //do something with result