2009-10-16 7 views
1

Vu le code ci-dessous:Comment rendre Action <param, param2> compatible avec le type de délégué de l'événement?

void LookupBox_Load(object sender, EventArgs e) 
{ 
    Action d = delegate 
     { 
      if (!_p.AutoClose) 
       CloseLookupBox(); 
     }; 

    if (this.ParentForm.MdiParent != null) 
     this.ParentForm.MdiParent.Deactivate += delegate { d(); }; 
    else 
     this.ParentForm.Deactivate += delegate { d(); }; 
} 

Est-il possible d'omettre le délégué {d(); }?

void LookupBox_Load(object sender, EventArgs e) 
{ 
    Action<object,EventArgs> d = delegate 
     { 
      if (!_p.AutoClose) 
       CloseLookupBox(); 
     }; 

    if (this.ParentForm.MdiParent != null) 
     this.ParentForm.MdiParent.Deactivate += d; 
    else 
     this.ParentForm.Deactivate += d; 
} 

Note: Je veux faire en ligne

Répondre

4

Absolument - changer le type de d pour commencer:

EventHandler d = delegate 
    { 
     if (!_p.AutoClose) 
      CloseLookupBox(); 
    }; 

Les méthodes anonymes ne sont pas seulement travailler avec Func et action ...

Pour référence ultérieure si, vous pouvez créer un nouveau délégué basé sur un existant avec signature compatible:

Action<object, EventArgs> d = ...; 
EventHandler handler = new EventHandler(d); 

Mais cette indirection supplémentaire est inutile dans ce cas :)

Vous pouvez également faire t il code d'appel légèrement plus simple trop en utilisant l'opérateur null-coalescent:

Form form = ParentForm.MdiParent ?? ParentForm; 
form.Deactivate += d; 

Comme vous êtes alors seulement en utilisant d une fois, vous pourriez inline il, en tournant la méthode tout en:

Form form = ParentForm.MdiParent ?? ParentForm; 
form.Deactivate += delegate 
{ 
    if (!_p.AutoClose) 
     CloseLookupBox(); 
}; 
+0

Whoops, tu as raison; il utilise un EventHandler vanille, donc je suppose que le générique n'est pas requis. L'utilisation du générique entraîne-t-elle des pénalités de performance? – gn22

+0

Eh bien, vous devez vous abonner avec le bon type, donc vous devrez créer une instance non générique de toute façon ... –

+0

+1 pour suggestion d'opérateur coalesce nulle. votre esprit peut vraiment saisir l'intention de chaque programme. – Hao

2

Pas beaucoup mieux, mais vous pourriez faire si vous utilisez C# 3.0:

if (this.ParentForm.MdiParent != null) 
    this.ParentForm.MdiParent.Deactivate += (x,y) => d(); 
else 
    this.ParentForm.Deactivate += (x,y) => d(); 
0

Vous devez utiliser EventHandler<MyEventArgs> pour définir les place du délégué action

EventHandler<EventArgs> d = delegate   
     {    
      if (!_p.AutoClose)     
       CloseLookupBox();   
     };