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 に答える