子类 child
父类 parent
parent P=new child();
现在我想复制一个这个P对象,但是目前我只知道这个P是Parent类,但我并不知道是哪个具体子类Child
我用哪个(二进制,json,xml,反射)方法可以实现不需要知道对象实际类型也能拷贝该对象所有属性的方法
不胜感激。
c#应该是不能,在内存管理上就决定了有类型区别。
想到一种解决方法,在子类加一个creatNew方法返回回去。。在里面进行复制
@猝不及防: 子类加一个creatNew——你这不只是区别了,而且已经可以确定了。无语~~
@花飘水流兮: 父类也加,子类重写,有问题吗?
@猝不及防: 没问题,很简单的明确的赋值
反射可以实现
namespace Q120328
{
class Program
{
static void Main(string[] args)
{
Shape shape = new Circle { Color = "Blue", Radius = 10 };
foreach (var p in shape.GetType().GetProperties())
{
Console.WriteLine(p.Name + ": " + p.GetValue(shape));
}
}
}
public class Shape
{
public string Color { get; set; }
}
public class Circle : Shape
{
public double Radius { get; set; }
}
}
输出是
Radius: 10
Color: Blue
我需要一个返回实例。。。子类类型不知道,不知道把这些属性组装成什么
我试一下
那看来GetType()获取的是子类,那样的话再create的没问题,懂了
序列化本身序列化的是对象,不会因为引用类型而只处理一部分属性。也就是你的P引用的对象就是一个子类对象,序列化再反序列化得到的对象,可以直接转换成子类对象。
好的,我试一下,我理解出问题了
一般情况不这么设计吧?实现colneable?
对象克隆建议实现ICloneable接口,如果是简单对象,直接使用MemberwiseClone函数即可。
class Parent : ICloneable
{
public string ValueA { get; set; }
public virtual object Clone()
{
return this.MemberwiseClone();
}
}
class Child : Parent
{
public string ValueB { get; set; }
}
Parent p = new Child()
{
ValueA = "a",
ValueB = "b"
};
var p1 = p.Clone() as Parent;
Debug.Assert(ReferenceEquals(p, p1) == false);
var p2 = p1 as Child;
Debug.Assert(p2 != null);
不需要知道对象实际类型, 是你的代码不知道,但是clr知道,所以你要让clr帮助你知道,懂了吗?问题解决