3

我正在使用此方法制作对象列表的深层副本:

public static List<TransformColumn> Clone(List<TransformColumn> original)
        {
            List<TransformColumn> returnValue;
            using (var stream = new System.IO.MemoryStream())
            {
                var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                binaryFormatter.Serialize(stream, original); //serialize to stream
                stream.Position = 0;
                //deserialize from stream.
                returnValue = binaryFormatter.Deserialize(stream) as List<TransformColumn>;
            }
            return returnValue;
        }

我的问题是如何更改此方法以接受任何类型的列表并返回该列表的克隆?

另外,请问您的答案的用法是什么!

4

2 回答 2

4
public static List<TEntity> Clone<TEntity>(List<TEntity> original)
{
   List<TEntity> returnValue = null;
   using (var stream = new System.IO.MemoryStream())
   {
      var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

      //serialize to stream 
      binaryFormatter.Serialize(stream, original);           
      stream.Position = 0;

      //deserialize from stream.
      returnValue = binaryFormatter.Deserialize(stream) as List<TEntity>;
   }

   return returnValue;
}

您可以通过允许任何类型来使您的方法更加通用,不仅可以List<>通过一组单元测试、错误处理查看我对同一问题的回答,而且它还被实现为易于使用的扩展方法。请参阅此 StackOverflow 帖子

方法的签名是:

 public static TObject DeepCopy<TObject>(
                      this TObject instance, 
                      bool throwInCaseOfError)         
      where TObject : class 

Ans 显然你可以在没有throwInCaseOfError参数的情况下创建更简单的重载:

     public static TObject DeepCopy<TObject>(this TObject instance)         
      where TObject : class 
于 2012-04-23T09:59:00.543 回答
3

将您的原型更改为:

public static List<T> Clone<T>(List<T> original)

将对象反序列化到的行:

returnValue = binaryFormatter.Deserialize(stream) as List<T>;

有关更多详细信息,请查看 MSDN 上的这篇文章:http: //msdn.microsoft.com/en-us/library/twcad0zb (v=vs.100).aspx

于 2012-04-23T09:58:35.550 回答