关于这个问题的答案将DataContext传递给Action(),如何从action(db)返回一个值?
SimpleUsing.DoUsing(db => {
// do whatever with db
});
Run Code Online (Sandbox Code Playgroud)
应该更像是:
MyType myType = SimpleUsing.DoUsing<MyType>(db => {
// do whatever with db. query buit using db returns MyType.
});
Run Code Online (Sandbox Code Playgroud)
sll*_*sll 107
您可以使用Func<T, TResult>通用委托.(见MSDN)
Func<MyType, ReturnType> func = (db) => { return new MyType(); }
Run Code Online (Sandbox Code Playgroud)
还有一些有用的泛型委托,它们考虑了一个返回值:
方法:
public MyType SimpleUsing.DoUsing<MyType>(Func<TInput, MyType> myTypeFactory)
Run Code Online (Sandbox Code Playgroud)
通用代表:
Func<InputArgumentType, MyType> createInstance = db => return new MyType();
Run Code Online (Sandbox Code Playgroud)
执行:
MyType myTypeInstance = SimpleUsing.DoUsing(
createInstance(new InputArgumentType()));
Run Code Online (Sandbox Code Playgroud)
或明确:
MyType myTypeInstance = SimpleUsing.DoUsing(db => return new MyType());
Run Code Online (Sandbox Code Playgroud)
Kir*_*oll 84
你的静态方法应该来自:
public static class SimpleUsing
{
public static void DoUsing(Action<MyDataContext> action)
{
using (MyDataContext db = new MyDataContext())
action(db);
}
}
Run Code Online (Sandbox Code Playgroud)
至:
public static class SimpleUsing
{
public static TResult DoUsing<TResult>(Func<MyDataContext, TResult> action)
{
using (MyDataContext db = new MyDataContext())
return action(db);
}
}
Run Code Online (Sandbox Code Playgroud)
这个答案源于评论,所以我可以提供代码.有关详细说明,请参阅下面的@sll的答案.
Ste*_*ham 13
您还可以利用lambda或匿名方法可以关闭其封闭范围中的变量这一事实.
MyType result;
SimpleUsing.DoUsing(db =>
{
result = db.SomeQuery(); //whatever returns the MyType result
});
//do something with result
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
104683 次 |
| 最近记录: |