我正在尝试使用反射为我的C#对象创建一个复制构造函数.我能够复制所有字段和属性(这些很容易)但我在复制事件时遇到了一些问题.
有没有办法(通过反射)将所有已订阅事件的委托从一个对象复制到另一个对象? (两者都是相同的类型)
谢谢 :)
最佳答案 它完全取决于实施.毕竟,事件可以以任何你想要的方式实现.如果您正在使用类似字段的事件,那么您应该只能复制字段值:
using System;
class Test
{
public event EventHandler SomeEvent;
public Test(Test other)
{
this.SomeEvent = other.SomeEvent;
}
}
这很好,因为委托是不可变的 – 订阅事件会创建一个新的委托并将其分配给字段,因此您的两个对象将是独立的.如果使用类似EventHandlerList
的事件实现事件,则需要创建克隆而不是使用简单的字段分配.
编辑:要使用反射执行此操作,您只需使用其他任何字段.类似字段的事件只是由字段支持的事件.如果您已经复制了课程中的所有字段,则无需执行任何额外的工作.
请注意,除非你付出额外的努力,否则你只会做一个浅的副本 – 例如,如果你有一个List< string>类型的字段,你的新对象将引用与旧对象相同的对象,所以任何将通过两个对象看到对列表的更改.