私はクラスObservableCollection
と他のプロパティを持っています。 は、だから、少しのようになります。クローンObservableCollection
public class A
{
public int Id { get; set; }
...
public object AValue {get; set;}
}
私は、このクラスのクローンオブジェクトをしたいと思います。 AValue
プロパティはObservableCollection
または別のオブジェクトにすることができます。 AValue
がObservableCollection型で、オブジェクトを追加しようとすると、クローンが元のオブジェクトと同じオブジェクトを持っているようです。クローンメソッドをAValue
プロパティにのみ使用すると、クラスA
のオブジェクトにはなりません。答えを
private object Clone(object obj)
{
var t = obj.GetType();
if (obj == null)
return null;
if (t.IsValueType || t == typeof(string))
{
return obj;
}
else if (t.IsGenericType)
{
if (obj is IList)
{
var c= typeof(ObservableCollection<>);
var cType = type.GetGenericArguments().First();
var gType = c.MakeGenericType(cType);
var newC = (IList)Activator.CreateInstance(gType);
foreach (var item in (IEnumerable)obj)
newC.Add(item);
return newC;
}
}
else if (t.IsClass)
{
object objV = Activator.CreateInstance(type);
FieldInfo[] fields = t.GetFields(BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo field in fields)
{
object fieldV = field.GetValue(obj);
if (fieldValue == null)
continue;
field.SetValue(objV, Clone(fieldV));
}
return obj;
}
throw new ArgumentException("Unknown type");
}
}
編集 感謝:私が使用しようとしたオブジェクトのクローンを作成するには。 あなたのコード@Sefeを追加しましたが、まだ動作しません。私は他のタイプがクローンしないことを知っていますが、まずリストを使ってやりたいと思います。私は間違いがどこにあるか分からない。 Aクラスのオブジェクトを取得し、オブジェクトをクローンし、クラスオブジェクトをダイアログボックスに送信します。私はクローンと元来のコレクションとプロパティを変更して同じです。 それはリストのジェネリック型
ObservableCollection<B> = new ObservableCollection<B>();
public class B: Base, ICloneable
{
...
public object Clone()
{
return this.MemberwiseClone();
}
}
にIClonableインターフェイスを追加するenoughtだ、それは一般的なタイプは、別のクラスから継承することが重要ですか?
コードにバグがあります。リストではないジェネリック型はどうですか?彼らはクローンされません。 – Sefe
@Sefe私もそれを見つけましたが、その場合例外がスローされます(これはおそらくNotImplementedExceptionかもしれませんが)。 –