如何将事件传递给另一个事件

时间:2017-03-08 09:17:33

标签: c#

我希望将事件传递给另一个事件,现在我使用函数来执行此操作。

C#可以像b.WriteEvent + = a.WriteEvent一样传递事件吗?

如果我有很多课程,只想把论证传递到上课。

我想要写:a.event + = b.event。 b.event + = c.event

而不是很多没用的方法。

感谢。

class Program
{
    static void Main(string[] args)
    {
        ClassA a = new ClassA();
        ClassB b = new ClassB();
        a.WriteEvent += MainWrite;
        b.WriteEvent += a.WireFunction; // Now I use
        //b.WriteEvent += a.WriteEvent; <= Can I use like this ?
        b.WireFunction("some str");
        Console.ReadLine();
    }

    static void MainWrite(string str)
    {
        Console.WriteLine(str);
    }
}

class ClassA
{
    public event Handler WriteEvent;
    public void WireFunction(string str)
    {
        WriteEvent(str);
    }
}

class ClassB
{
    public event Handler WriteEvent;
    public void WireFunction(string str)
    {
        WriteEvent(str);
    }
}

public delegate void Handler(string str);

1 个答案:

答案 0 :(得分:0)

事实:
您无法提供订阅活动的活动。

所有代理(事件,动作或函数)都是C#中的多播委托。 这意味着您可以多次订阅活动。 要订阅活动,您必须提供操作或功能。 (我使用术语函数而不是方法因为我们可以提供lambda)
以下是剪辑,将Event1的所有订阅者订阅到Event2 我相信这是你打算做的。

public class SomeClass
{
   public event EventHandler Event1;
   public event EventHandler Event2;

   public SomeClass()
   {
      Event1 += Subscriber1;
      Event1 += Subscriber2;

      var subscribers = Event1.GetInvocationList();

      if(subscribers != null)
      {
         foreach(var subscriber in subscribers)
         {
            EventHandler realSubscriber = (EventHandler)subscriber;
            Event2 += realSubscriber;
         }
      }

      Event1(this, EventArgs.Empty);
      Event2(this, EventArgs.Empty);
   }

   public void Subscriber1(object sender, EventArgs e)
   {
      Console.WriteLine("Subscriber 1 invoked");
   }

   public void Subscriber2(object sender, EventArgs e)
   {
      Console.WriteLine("Subscriber 2 invoked");
   }
}

创建SomeClass的实例将打印:
订阅者1调用了
订阅者2调用了
订阅者1调用了
订阅者2调用了

编辑:
我试图将逻辑移动到扩展方法,也移动到普通的实用方法。两者都不能很好地工作,因为当他们没有订阅者时事件是null。传递没有订阅者的事件将导致与传递null时相同的行为。现在,这是我能想到的最好的。