2017-03-08 97 views
1

我想将事件传递给另一个事件,现在我使用函数来执行该操作。如何将事件传递给另一个事件

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); 
+0

您可以对多个事件使用相同的事件处理程序:'b.WriteEvent + = MainWrite;' –

+0

不知道你为什么要问;编译器会提供一条错误消息。消息不明确吗?另外,你为什么试图这样做? – jeroenh

+0

原因是我的MainClass无法调用ClassB。谢谢 –

回答

0

事实:
不能提供签约了事件的事件。

C#中的所有代表(事件,动作或funcs)ar多播委托。 这意味着您可以多次订阅活动。 为了订阅活动,您必须提供一个动作或功能。 (我使用术语功能而不是方法,因为我们可能提供一个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通过相同的行为。现在,这是我能想到的最好的。