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

C# 无法克隆类对象

C# 无法克隆类对象,c#,clone,C#,Clone,以下是克隆对象失败的情况: [Serializable] public class MasterClass { public MasterClass(DataRow row) { EntityData = row; } public DataRow EntityData { get; set; } } 对于克隆,我使用以下扩展方法(Clone()): 克隆MasterClass对象时,在运行时抛出

以下是克隆对象失败的情况:

[Serializable]
public class MasterClass
{
    public MasterClass(DataRow row)
    {
        EntityData = row;
    }

    public DataRow EntityData
    {
        get;
        set;
    }
}
对于克隆,我使用以下扩展方法(
Clone()
):

克隆
MasterClass
对象时,在运行时抛出以下错误消息:

程序集System.Data中的类型System.Data.DataRow,版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089未标记为可序列化


任何解决方案如何处理此问题?

尝试添加无参数构造函数:

public MasterClass()
{
}

转换
数据行

假设您的
DataRow
有一个

[Serializable]
public class MyKeyValue {
    public string Key { get; set; }
    public string Value { get; set; }
}


[Serializable]
public class MasterClass
{
    public MasterClass() {}

    public MasterClass(DataRow row)
    {
        var list = new List<MyKeyValue>();
        foreach (DataColumn col in row.Table.Columns)
        {
            list.Add(new MyKeyValue{Key = col.ColumnName, Value = Convert.ToString(row[col.ColumnName])});
        }
        EntityData = list;
    }

    public IEnumerable<MyKeyValue> EntityData
    {
        get;
        set;
    }
}
[可序列化]
公共类MyKeyValue{
公共字符串密钥{get;set;}
公共字符串值{get;set;}
}
[可序列化]
公共课大师班
{
公共主类(){}
公共主类(数据行)
{
var list=新列表();
foreach(row.Table.Columns中的DataColumn列)
{
添加(新的MyKeyValue{Key=col.ColumnName,Value=Convert.ToString(行[col.ColumnName])));
}
EntityData=列表;
}
公共IEnumerable实体数据
{
得到;
设置
}
}

尝试添加无参数构造函数:

public MasterClass()
{
}

转换
数据行

假设您的
DataRow
有一个

[Serializable]
public class MyKeyValue {
    public string Key { get; set; }
    public string Value { get; set; }
}


[Serializable]
public class MasterClass
{
    public MasterClass() {}

    public MasterClass(DataRow row)
    {
        var list = new List<MyKeyValue>();
        foreach (DataColumn col in row.Table.Columns)
        {
            list.Add(new MyKeyValue{Key = col.ColumnName, Value = Convert.ToString(row[col.ColumnName])});
        }
        EntityData = list;
    }

    public IEnumerable<MyKeyValue> EntityData
    {
        get;
        set;
    }
}
[可序列化]
公共类MyKeyValue{
公共字符串密钥{get;set;}
公共字符串值{get;set;}
}
[可序列化]
公共课大师班
{
公共主类(){}
公共主类(数据行)
{
var list=新列表();
foreach(row.Table.Columns中的DataColumn列)
{
添加(新的MyKeyValue{Key=col.ColumnName,Value=Convert.ToString(行[col.ColumnName])));
}
EntityData=列表;
}
公共IEnumerable实体数据
{
得到;
设置
}
}

根据您使用数据行的目的,您可能必须将值解析为可序列化的自定义类。

根据您使用数据行的目的,您可能必须将值解析为可序列化的自定义类。

您必须实现接口-用于序列化,并添加用于反序列化的构造函数(SerializationInfo,StreamingContext上下文)。

必须实现接口-用于序列化,并添加用于序列化的构造函数(SerializationInfo,StreamingContext上下文)-用于反序列化。

问题不在于类,而在于属性必须是可序列化的。具有
DataRow
参数的构造函数必须是引导类对象的构造函数。还有其他解决方案吗?您可以有两个构造函数。但是您还需要将
DataRow
转换为可序列化的对象。是否可以将
DataRow
转换为
serializable
对象?请参见我的编辑,它将
DataRow
存储为对象的可序列化列表
MyKeyValue
。但是,所有值都从
对象
转换为
字符串
。问题不在于类,而是属性必须是可序列化的。具有
数据行
参数的构造函数必须是引导类对象的构造函数。还有其他解决方案吗?您可以有两个构造函数。但是您还需要将
DataRow
转换为可序列化的对象。是否可以将
DataRow
转换为
serializable
对象?请参见我的编辑,它将
DataRow
存储为对象的可序列化列表
MyKeyValue
。但是,所有值都从
对象
转换为
字符串
。有没有简单的方法来实现这一点,而不是将
数据行
转换为自定义可序列化类?我喜欢Robert Fricke的答案(编辑后)。这是最经典的,工作量最少。请记住,在使用值时要将它们转换回所需的值。有没有简单的方法来实现这一点,而不是将
DataRow
转换为自定义可序列化类?我喜欢Robert Fricke的答案(后期编辑)。这是最经典的,工作量最少。只要记住在使用它们时将它们转换为需要的值。