- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 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/
我想在 WebClient 对象回调时调用 BackgroundWorker 线程。 我要在此BackgroundWorker上运行的方法不是固定的,因此我需要以编程方式定位指定的方法。 要实现这一点
我有 MyServiceLibrary.dll,它代表几个类,例如 UserStorageService、Storage、User。该服务包含一个存储并将用户保存到存储中。 我创建了一个新的控制台应用
我一直在使用以下反射方法来创建某种类型的 Generic MethodInfo 对象 // this is the example that does work , i call the invoke
我需要获取每个对象的所有属性的名称 和值。其中一些是引用类型,所以如果我得到以下对象: public class Artist { public int Id { get; set; }
我有一个具有公共(public)静态属性的网络服务 Controller ,这些属性是网络服务。我使用反射来调用这些 Web 服务上的方法。 当所有的webservice属性都是静态的时候,完全没有问
假设我有一个通用接口(interface) IService和一个实现它的类 Service : IService我创建了该接口(interface)的代理: var proxy = new Dyna
在我的应用程序中,我从某处接收到 functionCode 值并需要反射(reflect)适当的类。我试图根据 this 反射(reflect)适当的类型解决方案。但它对我不起作用。我无法使用 Get
我一直在使用 KendoDynamicLinq图书馆多年来在这个项目上没有任何问题。我开始在同一项目/代码上使用 VS 2017 Community Edition 而不是 VS 2013,如果我使用
我是一名优秀的程序员,十分优秀!