En ce qui concerne la réponse à cette question Passage de DataContext dans Action () , comment puis-je retourner une valeur de action (db)?
SimpleUsing.DoUsing(db => {
// do whatever with db
});
Devrait être plus comme:
MyType myType = SimpleUsing.DoUsing<MyType>(db => {
// do whatever with db. query buit using db returns MyType.
});
Votre méthode statique devrait aller de:
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);
}
}
Cette réponse est née de commentaires afin que je puisse fournir du code. Pour une élaboration complète, veuillez consulter la réponse de @ sll ci-dessous.
Vous pouvez utiliser Func<T, TResult>
délégué générique. (Voir MSDN )
Func<MyType, ReturnType> func = (db) => { return new MyType(); }
Il existe également des délégués génériques utiles qui considèrent une valeur de retour:
Méthode:
public MyType SimpleUsing.DoUsing<MyType>(Func<TInput, MyType> myTypeFactory)
Délégué générique:
Func<InputArgumentType, MyType> createInstance = db => return new MyType();
Exécuter:
MyType myTypeInstance = SimpleUsing.DoUsing(
createInstance(new InputArgumentType()));
OU explicitement:
MyType myTypeInstance = SimpleUsing.DoUsing(db => return new MyType());
Vous pouvez également tirer parti du fait qu'une méthode lambda ou anonyme peut fermer des variables dans sa portée.
MyType result;
SimpleUsing.DoUsing(db =>
{
result = db.SomeQuery(); //whatever returns the MyType result
});
//do something with result
Utilisation Func<T>
plutôt que Action<T>
.
Action<T>
agit comme une méthode vide avec un paramètre de type T, tandis que Func<T>
fonctionne comme une fonction sans paramètre et renvoie un objet de type T. Si vous souhaitez définir des paramètres pour votre fonction, utilisez Func<TReturn, TParameter>
.