首页 > 解决方案 > 如何重用引用类中的事件?

问题描述

所以我有以下场景:

class A
{
  public event MyEventHandler MyEvent;
}

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

现在我想要实现的是,B 类,MySecondEvent基本上结合了 A 类的事件MyEvent 所以A 事件命中时,B也一样。

我知道我可以通过构造函数实现订阅,但这不是一个选项。而且继承的类也不能访问基类的子类。

在这种情况下,最好的解决方案是什么?谢谢!

标签: c#eventsmarshalling

解决方案


由于无论如何您都在使用反射,因此我将使用它来链接调用事件。

这是答案的修改形式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;
}

推荐阅读