添加到委托人的其他信息

时间:2018-11-06 14:13:03

标签: c# reflection observablecollection

也许这个问题已经被问过很多次了,但是我可能使用了错误的术语,因为到目前为止我还没有给出答案。

因此,我有一个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'事件的情况下,它可以正常工作。有了它,异常仍然存在。

1 个答案:

答案 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)