首页 新闻 会员 周边

c# 复制对象问题

0
悬赏园豆:50 [待解决问题]

子类 child
父类 parent

parent P=new child();

现在我想复制一个这个P对象,但是目前我只知道这个P是Parent类,但我并不知道是哪个具体子类Child

我用哪个(二进制,json,xml,反射)方法可以实现不需要知道对象实际类型也能拷贝该对象所有属性的方法

不胜感激。

猝不及防的主页 猝不及防 | 老鸟四级 | 园豆:2781
提问于:2019-09-27 14:56
< >
分享
所有回答(6)
0

c#应该是不能,在内存管理上就决定了有类型区别。

花飘水流兮 | 园豆:13560 (专家六级) | 2019-09-27 15:03

想到一种解决方法,在子类加一个creatNew方法返回回去。。在里面进行复制

支持(0) 反对(0) 猝不及防 | 园豆:2781 (老鸟四级) | 2019-09-27 15:13

@猝不及防: 子类加一个creatNew——你这不只是区别了,而且已经可以确定了。无语~~

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2019-09-27 15:26

@花飘水流兮: 父类也加,子类重写,有问题吗?

支持(0) 反对(0) 猝不及防 | 园豆:2781 (老鸟四级) | 2019-09-27 15:28

@猝不及防: 没问题,很简单的明确的赋值

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2019-09-27 15:44
0

反射可以实现

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
dudu | 园豆:30994 (高人七级) | 2019-09-27 15:46

我需要一个返回实例。。。子类类型不知道,不知道把这些属性组装成什么

支持(0) 反对(0) 猝不及防 | 园豆:2781 (老鸟四级) | 2019-09-27 16:07

我试一下

支持(0) 反对(0) 猝不及防 | 园豆:2781 (老鸟四级) | 2019-09-27 17:13

那看来GetType()获取的是子类,那样的话再create的没问题,懂了

支持(0) 反对(0) 猝不及防 | 园豆:2781 (老鸟四级) | 2019-09-27 17:18
0

序列化本身序列化的是对象,不会因为引用类型而只处理一部分属性。也就是你的P引用的对象就是一个子类对象,序列化再反序列化得到的对象,可以直接转换成子类对象。

授之以渔 | 园豆:1107 (小虾三级) | 2019-09-27 16:36

好的,我试一下,我理解出问题了

支持(0) 反对(0) 猝不及防 | 园豆:2781 (老鸟四级) | 2019-09-27 17:17
0

一般情况不这么设计吧?实现colneable?

顾晓北 | 园豆:10844 (专家六级) | 2019-09-27 16:52
0

对象克隆建议实现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);
天方 | 园豆:5407 (大侠五级) | 2019-09-28 17:08
0

不需要知道对象实际类型, 是你的代码不知道,但是clr知道,所以你要让clr帮助你知道,懂了吗?问题解决

A.Z | 园豆:306 (菜鸟二级) | 2019-10-01 12:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册