也许这个问题已经被问过很多次了,但是我可能使用了错误的术语,因为到目前为止我还没有给出答案。
因此,我有一个ObservableCollection,并且使用了反射来调用“ CollectionChanged”事件处理程序。
看起来像这样(“ o”是有问题的ObservableCollection,也通过反射获得):
EventInfo evi = o.GetType().GetEvent("CollectionChanged", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
var eventHandler = new Action<object, NotifyCollectionChangedEventArgs>(
(s, a) =>
{
// Event code here
});
var del = Delegate.CreateDelegate(evi.EventHandlerType, eventHandler.Method);
evi.AddEventHandler(o, del);
此操作的调用是自动的,并且在更改属性“ o”的元素时被调用。我可以调用消息框之类的,但我希望在此操作中捕获某种信息。特别地,所有这些都位于其中的类具有一个简单的int的ID。我想捕获此int并在操作中使用它。由于它的自动化性质,我似乎无法添加任何其他参数,因此我不确定如何管理它。
编辑:
我认为我要做的是创建一个新项目并尝试找出我遇到的问题。为了弄清楚结果在哪里结束,我尝试简单地引用事件中声明该事件的类中存在的属性,但由于其签名或安全透明性不兼容,我无法绑定到目标方法和委托类型的例外。我还会看到问题吗?这就是我想找出的。
代码在这里:Code
这很简单,只是一个测试类。其余所有代码都会执行此操作(因为MainWindow.xaml.cs是WPF项目),它创建TestClass的实例,将TestInt设置为10001,然后在该实例上调用TestMethod。
在没有'this.TestInt'事件的情况下,它可以正常工作。有了它,异常仍然存在。
答案 0 :(得分:1)
由于lambda捕获会导致创建状态对象,因此从旧的对象创建新的委托时,必须考虑@ExceptionHandler(BusinessResourceNotFoundException.class)
@ResponseBody
protected ResponseEntity<Fault> handleExceptionOfBusinessResourceNotFound(BusinessResourceNotFoundException exception) {
return new ResponseEntity<Fault>(exception.getFault(), HttpStatus.NOT_FOUND);
}
。因此,您需要使用以下Target
重载。即使没有目标对象的委托,此方法也很安全,msdn告诉我们有关对象参数的信息:
委托绑定到的对象,如果为null(将方法视为静态)(在Visual Basic中为Shared)。
代码的以下修改应该可以完成工作:
CreateDelegate(Type, Object, MethodInfo)