【问题标题】:How can I create a dynamic method to handle an event?如何创建动态方法来处理事件?
【发布时间】:2016-11-03 07:56:02
【问题描述】:

在 C# 中,如何创建可用于处理事件的动态方法?

这是一个事件:

public event EventHandler<EventArgs> refresh;

这是一个方法:

public void Test()
{

}

如何动态创建处理刷新事件的方法,使动态方法调用Test方法?

上面的 Test 方法是要调用的方法的示例。

【问题讨论】:

  • 为什么不能订阅该事件并从那里调用 Test 方法?
  • 该代码供用户在运行时订阅事件。上面调用的方法只是一个例子。
  • 所以“刷新”是一个类的事件,而 Test 是一个不属于该类的方法?
  • 是的。 “测试”可以在任何类中。具有“Test”方法的对象已经实例化。
  • 无论如何,你可以看看这个类似问题的答案:stackoverflow.com/a/45901/6347013

标签: c# dynamicmethod


【解决方案1】:

好吧,您可以简单地订阅该事件。

public class SomeClass
{
    public event EventHandler<EventArgs> refresh;
}

public void Test()
{
}

void Main()
{
    var some = new SomeClass();
    some.refresh += (sender, e) => Test();
    // or
    some.refresh += Refreshed;
}

void Refreshed(object sender, EventArgs e)
{
    Test();
}

【讨论】:

  • 这是我想要做的,但我需要有关如何动态创建“刷新”方法的帮助。
  • 你不能告诉我们为什么需要动态创建它吗?
  • “Test”方法是可以调用的方法示例。用户可以选择要调用的任何方法。因此,它必须动态创建。
  • 我想这就是我会在问题中写的那种信息。
  • @user3736648 如果“用户可以选择要调用的任何方法”,即。下拉列表,您可以删除所有订阅的事件 (See here for some pre-baked code),然后订阅所选方法 some.refresh += (sender, e) =&gt; ChoosenMethod();。这就是你所说的动态吗?
【解决方案2】:

如果您要调用的方法是某个类中的实例方法,并且您有该类的实例和方法的名称,则可以使用Delegate.CreateDelegate() 创建该方法的委托,然后使用 lambda在事件处理程序中调用它:

static EventHandler<EventArgs> CreateHandler(object methodObject, string methodName)
{
    var methodDelegate =
        (Action)Delegate.CreateDelegate(typeof(Action), methodObject, methodName);

    return (s, e) => methodDelegate();
}

然后用法可能如下所示(假设 Test 在类 C 中):

refresh += CreateHandler(new C(), "Test");

refresh(this, EventArgs.Empty);

【讨论】:

  • @downvoter 你认为这个答案有什么问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 2019-04-13
  • 2011-01-01
  • 1970-01-01
相关资源
最近更新 更多