0

カスタム クラス CustomClass があり、CollectionBase クラスから派生した CustomClassCollection という名前のコレクションがあるとします。私がこのようなことをするとしましょう:

CustomClassCollection a = new CustomClassCollection();
CustomClassCollection b = a;

の CustomClass 要素を変更するとa、 の要素bも変更されます。これらのクラスをどのように記述すれば、 の要素を代入して変更してaも同じままになりますか?bba

4

4 に答える 4

6

Cloneの(実装IClonable) またはコピー コンストラクターが必要ですCustomClassCollection

于 2012-10-11T13:24:26.797 に答える
1

で試すこともできますMemberwiseClone();

YourType other = (YourType) YourInstance.MemberwiseClone(); 

リンク: http://msdn.microsoft.com/fr-fr/library/system.object.memberwiseclone.aspx

于 2012-10-11T13:27:18.803 に答える
1

コレクションCloneの型にメソッドを実装する必要があります。

コレクション自体にメソッドを実装できるようになったら、ソースコレクションの各要素を複製すると、それがdestinationに追加されます。

于 2012-10-11T13:28:07.073 に答える
0
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

[Serializable]
class CustomClass
{
    int _id;
    string _value;

    public CustomClass(int id, string value)
    {
        _id = id;
        _value = value;
    }
}

[Serializable]
class CustomClassCollection
{
    private IList<CustomClass> _list = null;

    public CustomClassCollection()
    {
        _list = new List<CustomClass>();
    }

    public void Add(CustomClass a)
    {
        _list.Add(a);
    }
}

public static class CloneManager
{
    public static T Clone<T>(this T source)
    {
        if (!typeof(T).IsSerializable)
        {
            throw new ArgumentException("The type must be serializable.", "source");
        }

        if (Object.ReferenceEquals(source, null))
        {
            return default(T);
        }

        IFormatter formatter = new BinaryFormatter();
        Stream stream = new MemoryStream();
        using (stream)
        {
            formatter.Serialize(stream, source);
            stream.Seek(0, SeekOrigin.Begin);
            return (T)formatter.Deserialize(stream);
        }
    }
}

次のように使用します。

        CustomClassCollection a = new CustomClassCollection();
        CustomClassCollection b = ObjectCopier.Clone<CustomClassCollection>(a);

        a.Add(new CustomClass(1, "A"));
        a.Add(new CustomClass(2, "B"));
        a.Add(new CustomClass(3, "C"));

        b.Add(new CustomClass(1, "A"));
        b.Add(new CustomClass(2, "B"));
于 2012-10-11T13:47:47.347 に答える