2010-06-01 2 views
2

J'ai une méthode de rectification qui apparaît plusieurs fois dans mon code en vérifiant essentiellement que la connexion à l'odbc est correcte, puis se connecte mais chaque fois que cette méthode est appelée il appelle une autre méthode et chaque instance de la méthode principale celle-ci est différente, car chaque méthode est environ 8 lignes de code ayant 8 fois dans le code n'est pas idéal.C# en passant les noms de méthodes en tant qu'argument dans une méthode

Donc, fondamentalement, je voudrais avoir une seule méthode que je peux appeler en passant le nom de la nouvelle méthode comme argument.

donc essentiellement comme:

private void doSomething(methodToBeCalled) { if(somthingistrue) { methodToBeCalled(someArgument) } }

est-ce possible?

merci à l'avance

Répondre

3

Vous pouvez utiliser des délégués, ce qui est beaucoup comme un pointeur vers une fonction, vous pouvez passer un délégué à la méthode, qui invoquera avec le paramètre.

public delegate void Del(string message); 
// Create a method for a delegate. 
public static void DelegateMethod(string message) 
{ 
    System.Console.WriteLine(message); 
} 
// Instantiate the delegate. 
Del handler = DelegateMethod; 

// Call the delegate. 
handler("Hello World"); 

Dans votre cas

private void doSomething(Del methodToBeCalled) 
{ 
    if(somthingistrue) 
    { 
     methodToBeCalled(someArgument) 
    } 
} 

est-ce possible?

Delegates

+5

Je suggère d'utiliser le délégué 'Action ' trouvé dans la BCL plutôt que de définir des types de délégués personnalisés. Moins de choses à conserver, si rien d'autre. –

+1

Oui, c'est un bon point, utilisez tout ce qui est déjà fait dans le cadre, plutôt que les implémentations personnalisées, un peu comme jeter les exceptions .. beaucoup de gens adorent créer des exceptions personnalisées –

0

utiliser des délégués en tant que votre argument de méthode et vous pouvez pointer le délégué à la méthode qui vous voulez, vous tenez à fournir votre signature délégué.

0

Vous pouvez également utiliser la réflexion. Lequel est préférable d'utiliser (réflexion vs délégués) dépend du reste de votre code. Si vous appelez toujours des méthodes qui prennent les mêmes paramètres, un délégué est probablement le plus approprié. Si vous devez appeler des méthodes qui prennent des paramètres différents, vous devrez probablement utiliser la réflexion. En regardant votre question, il semble que vos méthodes ne prennent aucun paramètre, alors j'utiliserais les délégués comme mentionné précédemment.

+1

Vous n'avez pas nécessairement besoin de réflexion appeler une fonction avec des arguments.Vous pouvez contourner cette limitation, par ex. avec des fonctions lambda - voir ma réponse pour un exemple. – stakx

8

Comme déjà dit, vous pouvez utiliser des délégués pour cela:

// as in the original post: 
private void doSomething(Action methodToBeCalled) 
{ 
    if (somethingIsTrue) 
    { 
     methodToBeCalled(); 
    } 
} 

Pour les méthodes sans argument, cette méthode est appelée par exemple comme suit:

private void someMethod() 
{ 
    // ... 
} 

doSomething(someMethod); 

Si vous voulez appeler une méthode avec des arguments, vous pouvez envelopper une fonction lambda autour:

private void someMethodWithArgument(int arg) 
{ 
    // ... 
} 

doSomething(() => someMethodWithArgument(42)); 

Bien sûr, si vos méthodes à appeler toujours prendre le même genre d'argument, vous pouvez déclarer votre méthode doSomething afin qu'elle accepte un argument Action<T>/Action<T,T>/etc. à la place. Si vous souhaitez que les méthodes appelées retournent une valeur, utilisez plutôt un délégué de la famille Func<T>.

Questions connexes