我可以反映一个事件直接连接到c#中的另一个事件吗?或者是否有必要编写物理方法来引发一个事件,以便您可以反射性地将其连接到另一个事件?
我以为我需要使用GetRaiseMethod()所以我不必这样做,但文档说c#不会生成raise方法。
如果我刚刚问的话似乎完全偏离了我想要做的事情,那么请帮助我走上正轨。基本上我只想反思地查看两个事件,并且一个事件向前发展。
答案 0 :(得分:3)
假设你有一些事件
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
个委托。所以你需要一些方法。
答案 1 :(得分:1)
如果我刚刚问的话似乎完全偏离了我想要做的事情,那么请帮助我走上正轨。基本上我只是想反思地看两个事件,并且一个事件向前推进。
事件不是直接“连线”的事情。您可以使用EventInfo.AddEventHandler将委托添加为事件的新事件处理程序。这个代表可以是任何东西,包括引发另一个事件的方法。
您需要一个可以引发事件的方法,以及该方法的适当委托。完成后,您可以将其添加为事件处理程序,这将正确传递。
或者是否有必要对物理方法进行编码以引发一个事件,以便您可以反射性地将其连接到另一个事件?
是的,这是必需的。你不能只是“挂钩”两个事件 - 你需要有一些东西(一种方法)来引发第二个事件。
答案 2 :(得分:0)
这就是我想要的:
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();
}
答案 3 :(得分:0)
你可以举起一个名为&#34; On&#34;与事件有关的方法。通常是实现的,它按预期工作。
这是一个例子
创建一个空的TextBox
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);
}