2010-10-27 39 views
5

昨天跟进了我的问题,以便用C#中的事件深度复制一个对象,并将原始对象的事件附加到克隆副本上非常容易,您只需设置Copy中的Event声明=原始值。 Deep Clone when events are attached如何将一个原始对象的事件附加到一个深度复制的克隆

你如何在VB.Net中做到这一点? (使用.Net 2)

我希望也许有反射的东西,你可以检查什么事件绑定,并以某种方式将它们转移到新的对象。

回答

4

是的,你可以,并没有那么困难,但它似乎没有很多关于这个信息,这么大的问题。

 

Dim sourceObject As New FooBar 
Dim destObject As New FooBar 

AddHandler sourceObject.SomeEvent, AddressOf myFunc 


Dim miHandler As FieldInfo = GetType(FooBar).GetField("SomeEvent", BindingFlags.Static Or BindingFlags.NonPublic Or BindingFlags.Instance) 
Dim sourceDelegate As [Delegate] = miHandler.GetValue(sourceObject) 

Dim addDelegate As [Delegate] = sourceDelegate.GetInvocationList().First() ' if its multicast, then you'll need to copy the lot 

AddHandler destObject.SomeEvent, addDelegate 
 
+0

你知道这是否适用于asp.net? .GetField(“SomeEvent”)没有运气,它总是返回Nothing。 – mrmillsy 2014-12-17 15:15:41

+0

我相信这个几乎适用于带有代码隐藏的asp.net。随着代码隐藏部分类被继承到最终输出页面,您需要调用'Me.GetType.BaseType'。也许这个评论会对某人有用。 – mrmillsy 2014-12-18 11:56:41