关于这个问题Passing DataContext into 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.
}); 发布于 2011-11-12 04:53:09
你的静态方法应该是:
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的答案。
发布于 2011-11-12 04:37:45
您可以使用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-11-12 04:52:15
您还可以利用lambda或匿名方法可以关闭其封闭作用域中的变量这一事实。
MyType result;
SimpleUsing.DoUsing(db =>
{
result = db.SomeQuery(); //whatever returns the MyType result
});
//do something with resulthttps://stackoverflow.com/questions/8099631
复制相似问题