gpt4 book ai didi

.net - 使用反射添加事件处理程序时抛出 TargetException

转载 作者:行者123 更新时间:2023-12-02 06:16:23 28 4
gpt4 key购买 nike

我想在 WebClient 对象回调时调用 BackgroundWorker 线程。

我要在此BackgroundWorker上运行的方法不是固定的,因此我需要以编程方式定位指定的方法。

要实现这一点:传递给 WebClient 的事件参数对象的属性之一详细说明了应获取哪个方法 (e.UserState.ToString())。此方法正在按预期获得。

然后我希望做的是将获得的方法添加为BackgroundWorker.DoWork 事件的委托(delegate)。

// this line gets the targeted delegate method from the method name
var method = GetType().GetMethod(e.UserState.ToString(), BindingFlags.NonPublic | BindingFlags.Instance);
if (method != null)
{
// get the DoWork delegate on the BackgroundWorker object
var eventDoWork = _bw.GetType().GetEvent("DoWork", BindingFlags.Public | BindingFlags.Instance);
var tDelegate = eventDoWork.EventHandlerType;
var d = Delegate.CreateDelegate(tDelegate, this, method);

// add the targeted method as a handler for the DoWork event
var addHandler = eventDoWork.GetAddMethod(false);
Object[] addHandlerArgs = { d };
addHandler.Invoke(this, addHandlerArgs);

// now invoke the targeted method on the BackgroundWorker thread
if (_bw.IsBusy != true)
{
_bw.RunWorkerAsync(e);
}
}

由于某种原因,线路上抛出 TargetException

addHandler.Invoke(this, addHandlerArgs);

异常消息是

Object does not match target type.

我正在构建代码的方法的签名是

private void GotQueueAsync(object sender, DoWorkEventArgs e)

这与BackgroundWorker.DoWork事件处理程序的签名匹配。

任何人都可以向我解释我做错了什么或者为什么我无法以编程方式添加此处理程序方法。

[如果重要的话,这是一个 WP7 应用程序。]

最佳答案

您错误地传递了this:

addHandler.Invoke(this, addHandlerArgs);

具有事件的对象不是 this(尽管 this 有处理程序) - 它应该是 _bw:

addHandler.Invoke(_bw, addHandlerArgs);

不过更简单:

var d = (DoWorkEventHandler)Delegate.CreateDelegate(
typeof(DoWorkEventHandler), this, method);
_bw.DoWork += d;

或者至少使用EventInfo.AddEventHandler

关于.net - 使用反射添加事件处理程序时抛出 TargetException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11703991/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com