Comment créer un dictionnaire dans lequel je peux stocker des fonctions?
Merci.
J'ai environ 30+ fonctions qui peuvent être exécutées par l'utilisateur. Je veux pouvoir exécuter la fonction de cette façon:
private void functionName(arg1, arg2, arg3)
{
// code
}
dictionaryName.add("doSomething", functionName);
private void interceptCommand(string command)
{
foreach ( var cmd in dictionaryName )
{
if ( cmd.Key.Equals(command) )
{
cmd.Value.Invoke();
}
}
}
Cependant, la signature de la fonction n'est pas toujours la même, ayant donc un nombre d'arguments différent.
Réponses:
Comme ça:
Cela vous permet de stocker des fonctions qui acceptent un paramètre de chaîne et renvoient une valeur booléenne.
Ou si la fonction n'est pas anonyme:
où Foo est défini comme ceci:
METTRE À JOUR:
Après avoir vu votre mise à jour, il semble que vous ne connaissez pas à l'avance la signature de la fonction que vous souhaitez invoquer. Dans .NET, pour appeler une fonction, vous devez passer tous les arguments et si vous ne savez pas quels arguments vont être, le seul moyen d'y parvenir est la réflexion.
Et voici une autre alternative:
Avec cette approche, vous devez toujours connaître le nombre et le type de paramètres qui doivent être passés à chaque fonction à l'index correspondant du dictionnaire ou vous obtiendrez une erreur d'exécution. Et si vos fonctions n'ont pas de valeurs de retour, utilisez à la
System.Action<>
place deSystem.Func<>
.la source
Dictionary<int, Delegate>
.Commençons par quelques fonctions définies comme ceci:
Vous avez vraiment 2 options viables à votre disposition:
1) Maintenez la sécurité de type en demandant aux clients d'appeler directement votre fonction.
C'est probablement la meilleure solution, sauf si vous avez de très bonnes raisons de rompre avec ce modèle.
Lorsque vous parlez de vouloir intercepter des appels de fonction, il me semble que vous essayez de réinventer des fonctions virtuelles. Il existe une multitude de façons d'obtenir ce type de fonctionnalité hors de la boîte, comme hériter d'une classe de base et remplacer ses fonctions.
Il me semble que vous voulez une classe qui est plus un wrapper qu'une instance dérivée d'une classe de base, alors faites quelque chose comme ceci:
2) OU mappez l'entrée de vos fonctions sur une interface commune.
Cela peut fonctionner si toutes vos fonctions sont liées. Par exemple, si vous écrivez un jeu et que toutes les fonctions affectent une partie de l'inventaire du joueur ou du joueur. Vous vous retrouveriez avec quelque chose comme ça:
la source
object
semblable à celle qui serait passée à un nouveau fil.Hé, j'espère que ça aide. De quelle langue venez-vous?
la source
Pourquoi ne pas utiliser
params object[] list
pour les paramètres de méthode et faire une validation à l'intérieur de vos méthodes (ou de la logique d'appel), cela permettra un nombre variable de paramètres.la source
Le scénario suivant vous permettrait d'utiliser un dictionnaire d'éléments à envoyer en tant que paramètres d'entrée et d'obtenir le même que les paramètres de sortie.
Ajoutez d'abord la ligne suivante en haut:
Ensuite, dans votre classe, définissez le dictionnaire comme suit:
Cela vous permettrait d'exécuter ces fonctions anonymes avec une syntaxe similaire à celle-ci:
la source
Définissez le dictionnaire et ajoutez la référence de fonction comme valeur, en utilisant
System.Action
comme type:Puis invoquez-le avec:
la source