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