【发布时间】:2017-02-08 10:07:49
【问题描述】:
我有 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 类对象,然后我克隆对象并将 A 类对象发送到对话框。我从克隆和原始更改集合和属性是相同的。 将 IClonable 接口添加到泛型列表中就足够了
ObservableCollection<B> = new ObservableCollection<B>();
public class B: Base, ICloneable
{
...
public object Clone()
{
return this.MemberwiseClone();
}
}
泛型类型可以从另一个类继承重要吗?
【问题讨论】:
-
您的代码中可能存在错误。不是列表的泛型类型呢?它们不会被克隆。
-
标签: c#