none
c#里有无方法将基类对象赋值给派生类对象 RRS feed

  • 问题

  • 我需要将基类对象的属性值全部赋值到派生类对象中(甚至包括私有属性),除了通过反射一个一个属性的赋值,还有没有其他更好的方法?谢谢。

    可不可能有一种方法,直接将基类对象强制转换为派生对象(基类对象由基类初始化,非派生类初始化)?


    业精于勤,荒于嬉,行成于思,毁于随。
    2011年4月10日 4:20

答案

  • 您好,
    >TestClass A=new TestClass();
    然后A赋值过了,现在要将A变成DerivedClass
    根据你的意义, 你是说下面的代码可行吗?
    TestClass A=new TestClass();
    DerivedClass B = (DerivedClass)A;
    我想你是搞错了。根据我的理解不管是那个visual studio都是不可行的。你说VS2008可以运行, 但是当我运行上面这段代码时, 在编译时就报出“InvalidCastException”异常。如果你想实现你的那个需求, 我想你可以试试胡超提供的方法。

    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Aspen VJ 2011年4月20日 2:20
    2011年4月18日 3:20

全部回复

  • 基类建一个赋值方法,把派生类对象传进去
    http://feiyun0112.cnblogs.com/
    2011年4月11日 1:45
    版主
  • 看MemberwiseClone是否符合你想法。


    2011 c# mvp China. *George读起来像不像“饺子”?我爱吃饺子,我叫George。
    2011年4月12日 2:41
    版主
  • 基类建一个赋值方法,把派生类对象传进去
    http://feiyun0112.cnblogs.com/

    赋值方法仍然要一个属性一个属性的赋值,因为没有办法给this赋值。
    业精于勤,荒于嬉,行成于思,毁于随。
    2011年4月13日 5:46
  • 看MemberwiseClone是否符合你想法。


    2011 c# mvp China. *George读起来像不像“饺子”?我爱吃饺子,我叫George。

    不是这个意思,我希望能把基类初始化的对象赋值给派生类对象,或者强制转换为派生类对象。
    业精于勤,荒于嬉,行成于思,毁于随。
    2011年4月13日 5:48
  • 我就是希望在派生对象中能将基类对象的属性值、字段值都赋值过来,有没有简便的,非通过反射一个一个赋值的方法。
    业精于勤,荒于嬉,行成于思,毁于随。
    2011年4月13日 5:49
  • 没有现成的方法。楼主的想法类似于深度拷贝,只能自己去实现 IClonable  然后去调 Clone 方法。

    另外,值类型默认实现深度拷贝,也就是说,在给值类型赋值时,其赋值表达式的成员会被 Deep Clone 到被赋值的对象上。当然,这个有很多限制,比如类型要相同。值类型没有继承,虽然他们都派生于 System.Object。


    Mark Zhou
    2011年4月13日 7:50
  • 您好,

    我不清楚为什么你要这样做,因为派生类的实例本来就可以去访问基类中的属性。假设我现在有2个类:

    class TestClass
      {
        private int num;
    
        public int Num { get; set; }
    
        public TestClass() { }
        public TestClass(int num) { this.num = num; }
      }
    
      class DerivedClass : TestClass
      {
        private int total;
    
        public DerivedClass(int total) { this.total = total; }
      }

    然后我就可以在main方法中获得num的值:

     DerivedClass obj = new DerivedClass(40);
          int num = obj.Num;

    如果你非要基类实例中的属性字段都哦赋值到派生类实例中的话,就创建一个构造函数,里面传入A对象:

     public DerivedClass(TestClass t)
        {
          //...
        }
    但是私有的字段必须有公开的get属性或者一个返回该字段值方法才能取到值。
    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年4月13日 7:51

  •     public class Control
        {
            public int Width;
            public int Height;
        }
        public class WebControl:Control
        {
            public string Color;
        }
        public class Button:Control
        {
            public int Border;
        }
        class Program
        {
            public void  Factory(Control control)
            {
                if (control is WebControl)
                {
                    WebControl web = (WebControl)control;
                    Console.WriteLine("WebControl Color:"+web.Color);
                }
                if (control is Button)
                {
                    Button botton = (Button)control;
                    Console.WriteLine("Button Border:" + botton.Border.ToString());
                }
            }
            static void Main(string[] args)
            {
                Program p = new Program();
                WebControl web=new WebControl();
                web.Color="Blue";
                Button botton = new Button();
                botton.Border = 1;
                p.Factory(web);
                p.Factory(botton);
                Console.ReadLine();
            }
        }


    胡超
    • 已标记为答案 Aspen VJ 2011年4月20日 2:21
    • 取消答案标记 孤光掠影 2011年4月21日 10:30
    2011年4月13日 9:06
  • 您好,

    我不清楚为什么你要这样做,因为派生类的实例本来就可以去访问基类中的属性。假设我现在有2个类:

    class TestClass
    
     {
    
      private int num;
    
    
    
      public int Num { get; set; }
    
    
    
      public TestClass() { }
    
      public TestClass(int num) { this.num = num; }
    
     }
    
    
    
     class DerivedClass : TestClass
    
     {
    
      private int total;
    
    
    
      public DerivedClass(int total) { this.total = total; }
    
     }

    然后我就可以在main方法中获得num的值:

     DerivedClass obj = new DerivedClass(40);
    
       int num = obj.Num;

    如果你非要基类实例中的属性字段都哦赋值到派生类实例中的话,就创建一个构造函数,里面传入A对象:

     public DerivedClass(TestClass t)
    
      {
    
       //...
    
      }
    但是私有的字段必须有公开的get属性或者一个返回该字段值方法才能取到值。
    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    我现在就是要

    TestClass A=new TestClass();

    然后A赋值过了,现在要将A变成DerivedClass,其实主要是想给TestClass增加方法,但不在TestClass中实现。

    VS2008可以,VS2005好像不行。


    业精于勤,荒于嬉,行成于思,毁于随。
    2011年4月15日 3:40
  • 您好,
    >TestClass A=new TestClass();
    然后A赋值过了,现在要将A变成DerivedClass
    根据你的意义, 你是说下面的代码可行吗?
    TestClass A=new TestClass();
    DerivedClass B = (DerivedClass)A;
    我想你是搞错了。根据我的理解不管是那个visual studio都是不可行的。你说VS2008可以运行, 但是当我运行上面这段代码时, 在编译时就报出“InvalidCastException”异常。如果你想实现你的那个需求, 我想你可以试试胡超提供的方法。

    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Aspen VJ 2011年4月20日 2:20
    2011年4月18日 3:20
  • 您好,
    >TestClass A=new TestClass();
    然后A赋值过了,现在要将A变成DerivedClass
    根据你的意义, 你是说下面的代码可行吗?
    TestClass A=new TestClass();
    
    DerivedClass B = (DerivedClass)A;
    我想你是搞错了。根据我的理解不管是那个visual studio都是不可行的。你说VS2008可以运行, 但是当我运行上面这段代码时, 在编译时就报出“InvalidCastException”异常。如果你想实现你的那个需求, 我想你可以试试胡超提供的方法。

    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    vs2008用扩展方法来实现。

    业精于勤,荒于嬉,行成于思,毁于随。
    2011年4月21日 10:30
  • 跟我的问题相差太远。
    业精于勤,荒于嬉,行成于思,毁于随。
    2011年4月21日 10:30