[C#] .Net2: passer des expressions en paramètres

J’essaie de programmer une classe Trigger, évaluée toutes les X frames, qui lorsqu’une expression passée en paramètre est vraie, déclenche son évenèment on fire. Idéalement j’aimerais un truc du genre:

Trigger t = new Trigger(ObjA.value > ObjB.AnotherValue); t.Fire += SomeFunction;

Bon je suppose fortement qu’il faudrait en fait passer une fonction ou quelque chose comme ca, mais je ne vois pas exactement comment faire… je suis preneur de la méthode à prendre. :stuck_out_tongue:

Rhooo, on fait du .net et on connais même pas les delegates ? C’est quoi ce travail ?

Plus serieuxsement, matte la doc sur les delegates (un type qui encapsule un appel a une fonction).

Si t’es en .net 2.0, tu peux même utiliser des anonymous delegates. (tu passe un bout de code a la place d’une fonction).

Bref, RTFM :stuck_out_tongue: et si ca suffit pas, j’essayerais de faire un exemple qui soit parlant.

Si, je connais les delegate, mais pas les anonymous :stuck_out_tongue: vais voir ca :P. Merci. Bon après lecture, si j’ai (peut être?) bien compris, ca donne:

[code]delegate bool TestCase(int a, int b);

Trigger t = new Trigger(new TestCase() { delegate(int a, int b) { return(a>b); }} );
t.Fire += SomeFunction;[/code]

Euh et la je passe comment mes paramètre a ma fonction?, en arguments supplémentaires?

Une méthode anonyme, c’est juste un delegate sont le corps de la méthode est passé inline.

Oui, la valeur de tes paramètres doit provenir d’ailleurs : en donnant le trigger, tu lui indiques la logique de ta méthode, pas ses paramètres.

Pour ton exemple (2 int), tu pourrais avoir le code suivant :

[code]delegate bool TestCase(int a, int b);

static void Test()
{
int myA = 2, myB = -1;
Trigger t = new Trigger(delegate(int aa, int bb) { return(aa>bb); }, myA, myB);
t.Fire += SomeFunction;
}[/code]

tu pourrais aussi très bien ne renseigner tes variables A et B que plus tard au moyen de propriétés.

Et dans ta classe trigger, tu devrais avoir le code suivant :

[code]class Trigger
{
public Trigger(TestCase testMethod, int a, int B)
{
_testMethod = testMethod;
_a = a;
_b = b;
}

private TestCase _testMethod;

private int _a;

private int _b;

void IntervalElapsed()
{
if(_testMethod(_a, _b))
OnFile();
}
}[/code]

Par exemple…

Par contre si ton nombre d’arguments est susceptible de varier, ca va devenir un peu plus chiant : tu ne passeras plus un delegate précis, mais carrément un paramètre de type Delegate, et un tableau d’objets pour les paramètres (c’est la méthode la plus simple).

Sur ton Delegate, tu pourras appeler la méthode .Invoke(object[] params) qui appelle ta méthode peu importe sa signature. Par contre je n’ai pas regardé comment cela se comportait pour les valeurs de retour.

Justement le nombre d’arguments est susceptible de varier. Je vais regarder du coté des types Delegate. Merci pour le coup de pouce.