web-dev-qa-db-fra.com

Comment retourner la valeur de Action ()?

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.
}); 
71
4thSpace

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.

79
Kirk Woll

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:

  • Converter<TInput, TOutput> ( MSDN )
  • Predicate<TInput> - retourne toujours bool ( MSDN )

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());
102
sll

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
12
Steve Rowbotham

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>.

1
Ulysses Alves