Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#自定义复制构造函数,复制事件_C#_Reflection_Copy Constructor - Fatal编程技术网

C#自定义复制构造函数,复制事件

C#自定义复制构造函数,复制事件,c#,reflection,copy-constructor,C#,Reflection,Copy Constructor,我正在尝试使用反射为我的C#对象创建一个副本构造函数。我能够复制所有的字段和属性(这很容易),但是复制事件时遇到了一些问题 有没有办法(通过反射)将订阅事件的所有委托从一个对象复制到另一个对象?(两者将是同一类型) 谢谢:)这将完全取决于实施情况。毕竟,事件可以以任何方式实现。如果您使用的是类似于字段的事件,那么您应该能够只复制字段值: using System; class Test { public event EventHandler SomeEvent; public

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

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


谢谢:)

这将完全取决于实施情况。毕竟,事件可以以任何方式实现。如果您使用的是类似于字段的事件,那么您应该能够只复制字段值:

using System;

class Test
{
    public event EventHandler SomeEvent;

    public Test(Test other)
    {
        this.SomeEvent = other.SomeEvent;
    }
}
这很好,因为委托是不可变的-订阅事件将创建一个新委托并将其分配给字段,因此两个对象将是独立的。如果事件是使用类似的方式实现的,您可能希望创建克隆,而不是使用简单的字段分配

编辑:要对反射执行此操作,只需像其他字段一样使用字段。类字段事件只是由字段支持的事件。如果您已经在复制一个类中的所有字段,那么您将不会有任何额外的工作要做


请注意,除非您付出额外的努力,否则您只能进行一个浅层复制-例如,如果您有一个类型为
List
的字段,您的新对象将引用与旧对象相同的对象,因此对列表的任何更改都将通过这两个对象进行查看。

C#不是为具有复制构造函数而设计的;您是否尝试过
ICloneable.Clone()
Object.MemberwiseClone()
?我正在考虑实现这些接口,但我想要一个非常通用的构造函数,因为我在一个被其他几个类继承的类上实现它。对于复制构造函数,这不像C++ CTCR,它只是一个构造函数,它使用一个具有相同基类的对象并克隆它。我这样做的原因是因为类也需要被释放,所以如果我需要一个持久化的项,而不是重做整个释放计时,那么创建对象的副本似乎更容易:)是的,所有事件都类似于字段。但是我如何通过反射来做到这一点呢?太好了!谢谢:)我有原始对象、新对象和事件信息。我只是没有将事件从原始添加到新的。获取实际的委托需要一些工作,但一旦获得,我就能够调用field.AddEventHandler(copyObject,del);del是事件的委托人,copyObject是新实例。@joe_coolish:我不明白你为什么要麻烦。你为什么不直接复制这个字段,而忽略它支持一个事件的事实呢?@Jon Skeet:我所拥有的只是EventInfo项,而不是实际的字段。我没有实际字段,因为我在基类中实现了这个复制函数。我希望副本能在所有派生类中工作,这意味着我不可能了解所有字段。如果有一种方法可以使用EventInfo项复制字段,我将使用它。但是我的工作。我之所以说“had”,是因为我最终放弃了一切,选择了Object.MemberwiseClone()。我不得不修改基类中的一些内容,但最终效果更好。