Creating a cloned copy of subclass from baseclass

后端 未结 5 1708
鱼传尺愫
鱼传尺愫 2021-01-14 02:50

Consider this scenario:

public class Base
{
    public int i;
}

public class Sub : Base
{
    public void foo() { /* do stuff */}
}

And th

5条回答
  •  广开言路
    2021-01-14 03:01

    Here's one way (out of many possibilities) that you could do something like you're asking. I'm not sure this is very pretty and can be kind of ugly to debug, but I think it works:

    class BaseClass
    {
        public int i { get; set; }
    
        public BaseClass Clone(BaseClass b)
        {
            BaseClass clone = new BaseClass();
            clone.i = b.i;
            return clone;
        }
    
    }
    
    class SubClass : BaseClass
    {
        public int j { get; set; }
    
        public void foo() { Console.WriteLine("in SubClass with value of i = {0}", i.ToString()); }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            BaseClass b1 = new BaseClass() { i = 17 };
            BaseClass b2 = new BaseClass() { i = 35 };
    
            SubClass sub1 = CloneAndUpcast(b1);
            SubClass sub2 = CloneAndUpcast(b2);
    
            sub1.foo();
            sub2.foo();
        }
    
        static T CloneAndUpcast(BaseClass b) where T : BaseClass, new()
        {
            T clone = new T();
    
            var members = b.GetType().GetMembers(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance);
            for (int i = 0; i < members.Length; i++)
            {
                if (members[i].MemberType== MemberTypes.Property)
                {
                    clone
                        .GetType()
                        .GetProperty(members[i].Name)
                        .SetValue(clone, b.GetType().GetProperty(members[i].Name).GetValue(b, null), null);
                }
    
            }
            return clone;
        }
    }
    

    Basically, as you suggested, you use reflection to iterate through the object's properties (I set i and j as public properties) and set the values accordingly in the cloned object. The key is using generics to tell CloneAndUpcast what type you're dealing with. Once you do that, it's pretty straightforward.

    Hope this helps. Good luck!

提交回复
热议问题