2010-02-22 2 views
2

Comment convertir implicitement un délégué en un autre?Comment impliquer la conversion des délégués?

// old 
public delegate OldClickEventHandler(object sender, OldClickEventArgs e); 
class OldClickEventArgs 
{ 
public int intEnumValue; 
OldClickEventArgs(int enumValue){ this.intEnumValue = enumValue; } 
} 

// new 
public delegate NewClickEventHandler(object sender, NewClickEventArgs e); 
class NewClickEventArgs 
{ 
public MyEnum EnumValue; 
NewClickEventArgs(MyEnum enumValue){ this.EnumValue = enumValue; } 

public static implicit operator NewClickEventArgs(OldClickEventArgs e) { 
    return new NewClickEventArgs((MyEnum)e.intEnumValue); 
} 
} 

// class NewButton : OldButton 
// here I need to implicitly convert EventHandlers. HOW? 
// 
public event NewClickEventHandler Click 
{ 
    add { 
     oldObject.Click += value; // cannot convert New.. to Old.. 
    } 
    remove { 
     oldObject.Click -= value; // cannot convert New.. to Old.. 
    } 
} 

Répondre

3

Pour affecter le gestionnaire d'événements, ils doivent avoir la même signature. Dans ce cas, vous pouvez réaliser ceci si votre NewEventArgs étend OldEventArgs. Par exemple. Ensuite, vous devriez être en mesure d'affecter NewEventHandler à l'ancien événement.

+0

J'ai hérité 'NewEventArgs' de' OldEventArgs'. Cependant, le compilateur me dit qu'il ne peut pas convertir 'OldEventHandler' en' NewEventHandler'. – serhio

1

Je suppose que vous ne pouvez pas, sauf si vous voulez NewEventArgs hériter de OldEventArgs, mais peut-être cette approche peut faire l'affaire

modifier: les classes précédentes ont été un gâchis (et ne fonctionne pas). Ceux-ci devraient :-)

private Converter c = new Converter(); 

// when you want to trigger oldevent, call c.fireOld(sender, args); 

public event OldEventHandler OldEvent { 
    add { c.oldH += value; } 
    remove { c.oldH -= value; } 
} 

public event NewEventHandler New { 
    add { c.newH += value; } 
    remove { c.newH -= value; } 
} 

public class Converter { 
    public event OldEventHandler oldH; 
    public event NewEventHandler newH; 

    // call both old and new 
    public void fireOld(object o, OldEventArgs args) { 
     oldH(o, args); 
     newH(o, args); 
    } 
} 
+0

comment initialisez-vous 'c'? – serhio

+0

Je ne peux pas modifier OldEventArgs, car il hérite d'un wrapper AcX tiers. – serhio

+0

Modifié le post, vous devriez pouvoir les utiliser maintenant. Juste initialiser c où, dans le constructeur ou directement. Chaque fois que vous appelez "Old()", le nouveau déclencheur – Patrick