我希望将事件传递给另一个事件,现在我使用函数来执行此操作。
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 :(得分: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
时相同的行为。现在,这是我能想到的最好的。