2010-02-22 44 views
2

如何隱式地將委託轉換爲其他?我如何隱式委託轉換?

// 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.. 
    } 
} 

回答

3

爲了分配事件處理程序,它們必須具有相同的簽名。在你的情況下,如果你的NewEventArgs擴展了OldEventArgs,你可以做到這一點。例如。

class OldEventArgs : EventArgs 
{ 
    // ... implementation .. 
} 

class NewEventArgs : OldEventArgs 
{ 
    // ... implementation ... 
} 

在此之後,您應該能夠將NewEventHandler分配給舊事件。

+0

我從'OldEventArgs'繼承'NewEventArgs'。但是,編譯器告訴我不能將'OldEventHandler'轉換爲'NewEventHandler'。 – serhio 2010-02-22 13:21:10

1

我猜你不能,除非你想NewEventArgs從OldEventArgs繼承,但也許這種方法可以做的伎倆

編輯:以前的班是一個爛攤子(而沒有工作)。這些應該:-)

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

你怎麼初始化'c'? – serhio 2010-02-22 12:58:58

+0

我無法修改OldEventArgs,導致從第三方AcX包裝器繼承。 – serhio 2010-02-22 13:11:26

+0

編輯帖子後,您應該可以立即使用它們。只需在構造函數中或直接在任何地方初始化c。每當你打電話給「老()」,新的也會觸發 – Patrick 2010-02-22 13:23:42