Как повторно использовать событие из ссылочного класса? - PullRequest
0 голосов
/ 10 марта 2019

Итак, у меня следующий сценарий:

class A
{
  public event MyEventHandler MyEvent;
}

abstract class B : MarshalByRefObject
{
  public event MyEventHandler MySecondEvent;
  private A subClass;
}

Теперь я хотел бы добиться, класса B, MySecondEvent , чтобы в основном объединить событие MyEvent из класса A, , поэтому, когда A хиты событий , B тоже.

Я знаю, что мог бы добиться этой подписки через конструктор, но здесь это не вариант. И унаследованный класс также не может получить доступ к подклассу базового класса.

Что было бы лучшим решением в таком случае? Спасибо!

1 Ответ

1 голос
/ 10 марта 2019

Так как вы в любом случае используете отражение, я бы использовал его для цепочки вызова события.

Это измененная форма ответа https://stackoverflow.com/a/586156/6824955

class A
{
    public event EventHandler MyEvent;
}

abstract class B : MarshalByRefObject
{
    public B()
    {
        MySecondEvent += InvokeSubClass;
    }

    private void InvokeSubClass(object o, EventArgs e)
    {
        var eventDelegate = (MulticastDelegate)subClass.GetType()
            .GetField("MyEvent", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)
            .GetValue(subClass);

        if (eventDelegate != null)
        {
            foreach (var handler in eventDelegate.GetInvocationList())
            {
                handler.Method.Invoke(handler.Target, new object[] { subClass, e });
            }
        }
    }

    public event EventHandler MySecondEvent;
    private A subClass;
}
...