Как я неявное преобразование делегатов? - PullRequest
2 голосов
/ 22 февраля 2010

Как мне неявно преобразовать делегата в другого?

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

Ответы [ 2 ]

3 голосов
/ 22 февраля 2010

Чтобы назначить обработчик событий, они должны иметь одинаковую подпись. В вашем случае вы можете добиться этого, если ваш NewEventArgs расширяет OldEventArgs. Э.Г.

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

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

После этого вы сможете назначить NewEventHandler старому событию.

1 голос
/ 22 февраля 2010

Полагаю, вы не сможете, если вы не хотите, чтобы NewEventArgs наследовал от OldEventArgs, но, возможно, этот подход может сработать

edit: предыдущие классы были в беспорядке (и не работали). Это должно: -)

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...