2010-09-26 10 views
1

Est-il possible en C# de transmettre un délégué ou un événement à une méthode pour que la méthode puisse affecter un nouveau gestionnaire d'événements à ce délégué avec += (et non pour que la méthode puisse appeler le délégué)?Passer un délégué lui-même en tant que paramètre

Disons que je peux mélanger C++ avec C#. Ce serait ce que je cherche:

public class MyClass 
{ 
    public Action* actionPtr; 

    public void Assign(Action* action) 
    { 
     actionPtr = action; 
     (*action) += SomeMethod; 
    } 

    public void Unassign() 
    { 
     (*action) -= SomeMethod; 
    } 

    void SomeMethod() 
    { 
     // Do stuff 
    } 
} 

espoir il est logique.

+0

Il est peut-être préférable de prendre un peu de recul et d'expliquer ce que vous essayez de résoudre ici. Votre question est un peu difficile à suivre en l'état. – spender

+0

Peu importe que je l'ai compris. J'ai juste besoin de le passer comme ref. Merci quand même. – Juan

Répondre

3

Événement: no (sauf si vous êtes dans la classe où l'événement est défini). Ceci est appliqué par le compilateur C#.

Ancien délégué: oui. Passez-le comme un paramètre ref.

(Pensez-y de cette façon: comment voulez-vous ajouter un gestionnaire à un délégué Vous utilisez +=, droit qui est une cession opérateur, qui est statique: vous assignez le délégué à une nouvelle instance de délégué qui comprend la méthode indiquée à droite de la +=, tout comme x += 1 attribue x-x + 1. le seul moment où vous pouvez jamais assigner une variable externe à une nouvelle valeur ou d'un objet à partir d'une méthode est quand il a été adopté comme ref ou out paramètre).

Par exemple, le code suivant laisse intact list:

List<int> list = null; 

InitializeListImproperly(list); 

static void InitializeListImproperly(List<int> x) 
{ 
    // x is a local variable, so this does nothing to the list variable 
    // outside this scope! 
    x = new List<int> { 1, 2, 3 }; 
} 

Voici attribuerait à une nouvelle List<int>:

List<int> list = null; 

InitializeListProperly(ref list); 

static void InitializeListProperly(ref List<int> x) 
{ 
    x = new List<int> { 1, 2, 3 }; 
} 

Ce principe est le même.

+0

J'ai compris le passage du délégué comme une chose 'ref', mais y a-t-il aussi un moyen d'en garder une copie afin de pouvoir l'annuler plus tard avec' - = '? – Juan

+0

@jsoldi: Conserver une copie de quoi? –

+0

Eh bien, si j'attribue un nouveau gestionnaire d'événement à un délégué avec '+ =', je dois le désaffecter quand j'ai terminé? Donc, si je ne veux pas l'annuler dans la même méthode qui le reçoit comme paramètre 'ref', y a-t-il un moyen de le désaffecter plus tard? Comme si je garderais un pointeur sur delegate (pas sur la méthode à appeler par le délégué). – Juan

Questions connexes