2009-03-17 6 views
1

Je restructure le code Opur pour utiliser des génériques. Nous utilisons (par nécessité, aucun changement possible ici) propre code pour attacher/détacher/itérer/appels délégués. Avant il y avait les classes X, Y, Z qui a déclaré leur propre:Est-il possible d'alias/référencer un délégué d'un délégué?

public delegate void Event_x_Delegate(ref ComParam pVal, out bool result); 

A ce moment, je passe ce délégué à la classe générique:

public sealed class Event_X_Handling : BasicEvent<Event_X_Handling.Event_x_Delegate> 

avec le BasicEvent beeing

public abstract class BasicEvent<DELEGATE> : Loggable 
    where DELEGATE: class { ... 

Cela fonctionne très bien, j'ai donc généralisé la fonctionnalité attach/detach.

Mais maintenant, je voudrais généraliser l'itération/appel aussi. Comme X, Y, Z ne diffèrent que par quelque chose "ref ComParam pVal" comme cela fonctionne bien:

public abstract class BasicEventListener<EVENTPARAM1> : 
    BasicEvent<BasicEventListener<EVENTPARAM1>.BasicDelegate<EVENTPARAM1>> { 

    #region TYPES 

    public delegate void BasicDelegate<PARAM1>(ref EVENTPARAM1 pVal, out bool result); 

    #endregion 

avec X, Y, Z changeant:

public sealed class Event_X_Handling : BasicEventListener<ComParam> 

Mais voilà le problème qui se cache autour du coin: attach/detach maintenant travailler avec un BasicEventListener.BasicDelegate. Mais beaucoup de code. fait référence à Event_X_Handling.Event_x_Delegate, car ils utilisaient malheureusement la syntaxe NET1.1 pour créer des délégués (en entrant Event + = new Delegate_X (_listen)).

Donc en bref: est-il un moyen d'un alias un Event_x_Delegate à un BasicDelegate? Je ne peux pas vraiment voir d'autres possibilités. PS: Bien sûr, je vois que, en cassant les classes de base à l'invocation dynamique dans l'itération/appel je pourrais l'implémenter sans introduire le BasicDelegate. Mais ce n'est pas très élégant à mon humble avis.

Répondre

1

Non, il n'y a pas d'équivalent de typedef (ce que je pense est ce que vous demandez).

Je dois dire que search-and-replace peut être votre ami ici!

11

Perahps a using alias travaillera pour vous?

using System; 

using IntFunc = System.Func<int>; 

namespace DelegateAlias 
{ 
    class Program 
    { 
     static int foo() { return 314; } 
     static void Main(string[] args) 
     { 
     IntFunc f = foo; 
     } 
    } 
}