【问题标题】:Cloning dynamic object in c#在 C# 中克隆动态对象
【发布时间】:2012-09-26 12:51:24
【问题描述】:

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

    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,我不知道info的结构)并且它不会被标记为可序列化。我需要将此信息复制到实体的先前信息部分。

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

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

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

【问题讨论】:

  • data.Infonull。这就是你得到异常的原因。
  • 那么if(ReferenceEquals(obj, null))检查是怎么通过的呢?
  • 有趣。 typeof(T)typeof(T).IsClass 是什么?
  • typeof(T).IsClass 为真,Name = "Info" FullName = "Project.Entities.Info",所以它进入检查并通过它。

标签: c# clone


【解决方案1】:

怎么样

var clone = JsonConvert.DeserializeObject<dynamic>(JsonConvert.SerializeObject(obj));

【讨论】:

    【解决方案2】:

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

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

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

    基本上,这种情况*没有好的答案。没有什么神奇的方法可以深度克隆“一个东西”。

    【讨论】:

      【解决方案3】:

      我一直在使用JSON.net 来序列化用户定义的类型,并且效果很好。

      有标志可以忽略空属性,否则默认另存为

      {propname: 'undefined'}
      

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

      这里是nuget package

      【讨论】:

        猜你喜欢
        • 2011-02-04
        • 2013-02-18
        • 1970-01-01
        • 2013-01-09
        • 2011-05-15
        • 2012-04-01
        • 2014-03-07
        • 2010-09-18
        相关资源
        最近更新 更多