Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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#_Generics_Types_Constructor_Clone - Fatal编程技术网

C# 从同一类型获取对象的构造函数

C# 从同一类型获取对象的构造函数,c#,generics,types,constructor,clone,C#,Generics,Types,Constructor,Clone,因此,我想为我的类EmployeeNodeClass创建构造函数,它接受EmployeeNodeClass对象,并使用deepclone函数复制它: publicstatict-DeepClone(T-obj) { 使用(var ms=new MemoryStream()) { var formatter=新的二进制格式化程序(); 序列化(ms,obj); ms.Position=0; 返回(T)格式化程序。反序列化(ms); } } 到新对象 起初,我认为这很简单 public Emplo

因此,我想为我的类
EmployeeNodeClass
创建构造函数,它接受
EmployeeNodeClass
对象,并使用deepclone函数复制它:

publicstatict-DeepClone(T-obj)
{
使用(var ms=new MemoryStream())
{
var formatter=新的二进制格式化程序();
序列化(ms,obj);
ms.Position=0;
返回(T)格式化程序。反序列化(ms);
}
}
到新对象

起初,我认为这很简单

public EmployeeNodeClass(EmployeeNodeClass EMPND)
{
这=深度克隆(EMPND);
}
但是我得到了一个错误,
这个
是只读的


那么我该怎么做呢?

可以使用NewtonSoft JsonConvert.PopulateObject:

例如:

class Entity
{
    public List<int> List { get; set; }

    public Entity(List<int> list)
    {
        List = list;
    }

    public Entity(Entity original)
    {
        string originalJson = JsonConvert.SerializeObject(original);
        JsonConvert.PopulateObject(originalJson, this);
    }
}
类实体
{
公共列表{get;set;}
公共实体(列表)
{
列表=列表;
}
公共实体(实体原件)
{
string originalJson=JsonConvert.SerializeObject(原始);
PopulateObject(原始JSON,this);
}
}
使用它:

static void Main(string[] args)
    {
        var entity1 = new Entity(new List<int> { 1, 2, 3 });
        var entity2 = new Entity(entity1);
        entity1.List[0] = 5;
        Console.WriteLine(entity2.List[0]);
    }
static void Main(字符串[]args)
{
var entity1=新实体(新列表{1,2,3});
var entity2=新实体(entity1);
entity1.列表[0]=5;
Console.WriteLine(entity2.List[0]);
}

注意:因为它使用NewtonSoft Json,所以它只克隆公共的可写属性。因此,私有字段(与此类属性不关联)中的内部状态将丢失。

如果您的类型具有引用类型成员,则这样序列化将不能保证深度克隆。
ThisEmployee
成员的声明是什么?@OlivierRogier抱歉,构造错误。编辑it@AvivVetaroNet中没有任何东西可以保证复杂类型的简单深度克隆。您必须知道您的类型并复制字段
IClonable
本打算帮助实现这一点,但在实践中失败了。不要使用构造函数。创建一个返回T的静态方法。