C#Custom Copy构造函数,复制事件

时间:2011-01-22 19:06:13

标签: c# reflection copy-constructor

我正在尝试使用反射为我的C#对象创建一个复制构造函数。我能够复制所有字段和属性(这些很容易)但我在复制事件时遇到了一些问题。

有没有办法(通过反射)将所有已订阅事件的委托从一个对象复制到另一个对象? (两者都是相同的类型)

谢谢:)

1 个答案:

答案 0 :(得分:2)

完全取决于实施。毕竟,事件可以以任何你想要的方式实现。如果您正在使用类似字段的事件,那么您应该只能复制字段值:

using System;

class Test
{
    public event EventHandler SomeEvent;

    public Test(Test other)
    {
        this.SomeEvent = other.SomeEvent;
    }
}

这很好,因为委托是不可变的 - 订阅事件会创建一个新的委托并将其分配给字段,因此您的两个对象将是独立的。如果使用类似EventHandlerList的内容实现事件,您可能希望创建克隆而不是使用简单的字段分配。

编辑:要使用反射执行此操作,您只需使用其他任何字段。类似字段的事件只是由字段支持的事件。如果您已经复制了课程中的所有字段,那么您将无需做任何额外的工作。

请注意,除非您付出额外的努力,否则您只会制作副本 - 例如,如果您有List<string>类型的字段,则您的新对象会引用与旧对象相同的对象,因此可以通过两个对象看到对列表的任何更改。