克隆c#中的动态对象

时间:2012-09-26 12:51:24

标签: c# clone

我在使用如下代码克隆动态对象时遇到问题:

    public void Execute(IPrepareData entity)
    {
        try
        {                
            dynamic data = entity.Primary as dynamic;
            data.PreviousInfo = deepClone(data.Info);
        }
        catch (Exception ex)
        {
            data.Errors.Add(ex.Message);
        }
    }

    private static T deepClone<T>(T obj)
    {
        if (typeof(T).IsClass || typeof(T).IsArray)
        {
            if (ReferenceEquals(obj, null))
            {
                return default(T);
            }
        }
        using (var memoryStream = new MemoryStream())
        {
            BinaryFormatter fieldFormatter = new BinaryFormatter();
            fieldFormatter.Serialize(memoryStream, obj);
            memoryStream.Position = 0;
            return (T)fieldFormatter.Deserialize(memoryStream);
        }
    }

    dynamic data;

我事先并不知道实体的结构(只是它包含Info,我不知道信息的结构)并且它不会被标记为可序列化。我需要将此信息复制到实体的先前信息部分。

执行此代码的结果是“对象引用未设置为fieldFormatter.Serialize行上的对象实例”。

如何检查它是否是对象的实例?

可能(很可能会是)循环引用,所以我不是在尝试反思,因为我不知道如何处理它。速度也不是问题。

3 个答案:

答案 0 :(得分:3)

如果您不知道数据会被标记为可序列化,那么您就不能依赖BinaryFormatter

如果对象可能有循环引用,那么很多其他序列化程序都是不可能的。

如果我们假设它是dynamic一般情况(而不仅仅是ExpandoObject),则无法获取有关成员的信息,因为它们可以被发明,因为他们被查询。

基本上,这种情况*没有好的答案。没有神奇的方法来深入克隆“一件事”。

答案 1 :(得分:2)

怎么样?
var clone = JsonConvert.DeserializeObject<dynamic>(JsonConvert.SerializeObject(obj));

答案 2 :(得分:0)

我一直在使用JSON.net来序列化用户定义的类型,并且它一直运行良好。

有些标志可以忽略null属性,或者默认情况下会保存为

{propname: 'undefined'}

我知道你提到速度不是问题,但序列化器非常快。

这是nuget package