我可以反射性地将一个事件直接连接到 c# 中的另一个事件吗?或者是否有必要编写一种物理方法来引发一个事件,以便您可以反射性地将其连接到另一个事件?
我在想我需要使用 GetRaiseMethod() 所以我不必这样做,但文档说 c# 不会生成 raise 方法。
如果我刚刚问的问题似乎完全偏离了我正在尝试做的事情,那么请帮助我走上正轨。基本上,我只想反思性地查找两个事件,并将一个事件转发给另一个事件。
我可以反射性地将一个事件直接连接到 c# 中的另一个事件吗?或者是否有必要编写一种物理方法来引发一个事件,以便您可以反射性地将其连接到另一个事件?
我在想我需要使用 GetRaiseMethod() 所以我不必这样做,但文档说 c# 不会生成 raise 方法。
如果我刚刚问的问题似乎完全偏离了我正在尝试做的事情,那么请帮助我走上正轨。基本上,我只想反思性地查找两个事件,并将一个事件转发给另一个事件。
假设你有一些事件
class A
{
public event EventHandler<MyEventArgs> MyEvent;
}
和其他一些事件
class B
{
public event EventHandler<MyEventArgs> MyOtherEvent;
以及引发该事件的方法
protected void OnMyOtherEvent(MyEventArgs e)
{
var handler = MyEvent;
if (handler != null)
handler(this, e);
}
那么你可以MyOtherEvent
在任何时候MyEvent
加注,如下所示:
public B(A a)
{
a.MyEvent += (sender, e) => OnMyOtherEvent(e);
}
}
请注意,您不能简单地将MyOtherEvent
代表添加到MyEvent
事件中,因为MyOtherEvent
事后可能会添加更多代表。所以你需要一些介于两者之间的方法。
如果我刚刚问的问题似乎完全偏离了我正在尝试做的事情,那么请帮助我走上正轨。基本上,我只想反思性地查找两个事件,并将一个事件转发给另一个事件。
事件不是直接“连接”的东西。您可以使用EventInfo.AddEventHandler将委托添加为事件的新事件处理程序。这个委托可以是任何东西,包括引发另一个事件的方法。
您将需要一个可以引发您的事件的方法,以及该方法的适当委托。完成此操作后,您可以将其添加为事件处理程序,这将正确通过。
或者是否有必要编写一种物理方法来引发一个事件,以便您可以反射性地将其连接到另一个事件?
是的,这是必需的。你不能仅仅“连接”两个事件——你需要有一些东西(一种方法)来引发第二个事件。
这就是我一直在寻找的:
public event Action evt
public void RaiseEvent()
{
var type = GetType();
var fld = type.GetField("evt", BindingFlags.NonPublic | BindingFlags.Instance);
var fldValue = (MulticastDelegate)fld.GetValue(this);
fld.DynamicInvoke();
}
您可以调用与该事件相关的“On”方法来引发事件。通常已实施并且按预期工作。
这里有一个例子
创建一个空的文本框
TextBox myTextBox = new TextBox();
myTextBox.TextChanged += new EventHandler(myTextBox_TextChanged);
void myTextBox_TextChanged(object sender, EventArgs e)
{
Console.WriteLine("something");
}
引发 TextChange 事件
MethodInfo mi = myTextBox.GetType().GetMethod("OnTextChanged", BindingFlags.Instance | BindingFlags.NonPublic);
try
{
mi.Invoke(myTextBox, new object[] { EventArgs.Empty });
}
catch (Exception ex)
{
Console.WriteLine(ex);
}