将事件直接连接到另一个事件

时间:2012-12-05 23:06:58

标签: c# events reflection

我可以反映一个事件直接连接到c#中的另一个事件吗?或者是否有必要编写物理方法来引发一个事件,以便您可以反射性地将其连接到另一个事件?

我以为我需要使用GetRaiseMethod()所以我不必这样做,但文档说c#不会生成raise方法。

如果我刚刚问的话似乎完全偏离了我想要做的事情,那么请帮助我走上正轨。基本上我只想反思地查看两个事件,并且一个事件向前发展。

4 个答案:

答案 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);                
        }