2

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

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

如果我刚刚问的问题似乎完全偏离了我正在尝试做的事情,那么请帮助我走上正轨。基本上,我只想反思性地查找两个事件,并将一个事件转发给另一个事件。

4

4 回答 4

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事后可能会添加更多代表。所以你需要一些介于两者之间的方法。

于 2012-12-05T23:18:54.647 回答
1

如果我刚刚问的问题似乎完全偏离了我正在尝试做的事情,那么请帮助我走上正轨。基本上,我只想反思性地查找两个事件,并将一个事件转发给另一个事件。

事件不是直接“连接”的东西。您可以使用EventInfo.AddEventHandler将委托添加为事件的新事件处理程序。这个委托可以是任何东西,包括引发另一个事件的方法。

您将需要一个可以引发您的事件的方法,以及该方法的适当委托。完成此操作后,您可以将其添加为事件处理程序,这将正确通过。

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

是的,这是必需的。你不能仅仅“连接”两个事件——你需要有一些东西(一种方法)来引发第二个事件。

于 2012-12-05T23:20:01.197 回答
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();
}
于 2012-12-06T00:03:06.073 回答
0

您可以调用与该事件相关的“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);                
        }
于 2014-04-22T14:50:43.947 回答