C# 派生类和基类,可以显式设置基类吗?

C# 派生类和基类,可以显式设置基类吗?,c#,reflection,copy-constructor,derived-class,C#,Reflection,Copy Constructor,Derived Class,如何设置派生超级跑车的基类 例如,我想简单地设置超级跑车基类如下: public class SuperCar: Car { public bool SuperWheels { get {return true; } } } public class Car { public bool HasSteeringWheel { get {return true;} } } public void SetCar( Car car ) { SuperCar scar = new

如何设置派生超级跑车的基类

例如,我想简单地设置超级跑车基类如下:

public class SuperCar: Car
{
     public bool SuperWheels { get {return true; } }
}

public class Car 
{
     public bool HasSteeringWheel { get {return true;} }
}
public void SetCar( Car car )
{
SuperCar scar = new SuperCar();
car.Base = car; 
}
基本上,如果我有汽车对象,我不想手动迭代汽车的每个属性来设置超级汽车项目,我认为这是唯一可以做到的方法,但如果你可以用另一种方法来做,它会更好

这是不可能的


您需要手动设置属性。

如果我正确地理解了您的问题(并且我不完全确定我是否正确),那么您可以通过执行以下操作来获得所需的行为:

public class SuperCar: Car
{
     public bool SuperWheels { get {return true; } }
}

public class Car 
{
     public bool HasSteeringWheel { get {return true;} }
}
public void SetCar( Car car )
{
SuperCar scar = new SuperCar();
car.Base = car; 
}
然后你可以这样做:

class Car {
    public bool CarProperty { get; set; }
    // regular constructor
    public Car() {

    }
    // "copy" constructor
    public Car(Car c) {
        CarProperty = c.CarProperty;
    }
}

class SuperCar : Car {
    public bool SuperCarProperty { get; set; }
    // regular constructor
    public SuperCar() {
    }
    // "copy" constructor
    public SuperCar(Car c) : base(c) {
        SuperCar sc = c as SuperCar;
        if(sc != null) {
            SuperCarProperty = sc.SuperCarProperty;
        }
    }
请注意,在“复制”构造函数中必须非常小心,不要以两个对象共享相同成员(引用)的方式复制属性,而不应该这样做


不过,我必须问一下,你的目标是什么?

首先,每个超级跑车对象都不同于其他对象继承可帮助您定义相关对象的常见行为,但这并不意味着它们是相同的对象。类型的每个对象都有自己的构造过程。在创建子对象之前,将按照继承层次结构创建基类的对象。如果希望对所有超级汽车对象使用公共属性,则需要在超级汽车实例中维护汽车对象的单独实例,将公共汽车对象指定给超级汽车中的汽车对象,并覆盖从基本汽车对象派生的属性,并将其重定向到道具。汽车内部物体的形状

public void SetCar(Car car) {
    SuperCar scar = new SuperCar(car);
}

但我仍然相信,你想要的设计方式有问题。如果您能让我们知道您为什么要这样做,我们可能会提出更好的设计来满足您的需求。

您只能复制另一个类的内容,而不能直接设置它。请参阅下面使用所谓的复制构造函数的示例

public class SuperCar: Car
{
     public bool SuperWheels { get {return true; } }

     Car carInstance = null;
     public void SetCar( Car car )
     {
         carInstance = car; 
     }
}

关键是构造函数声明后的关键字
base()

总之,有很多有用的注释。我认为pst给出了简短的答案,我认为这是正确的:

否。简短原因:没有单独的基础对象。(对象)此==(对象)基始终为真。不过,也有通过反射(和其他方式)执行克隆/复制的方法。也许描述一下真正想要的是什么


所以,他关于使用automapper工具的建议也非常有用,基本上就是我想要的

我在子类中使用了类似的东西,它对我来说很好:

class Car
{
    string model;
    public Car(string model) { this.model = model; }
    protected Car(Car other) { this.model = other.model; }
    string Model { get; set; }
}

class SuperCar : Car
{
    public SuperCar(Car car) : base(car) { }
    public SuperCar(string model) : base(model) { }
    bool IsTurbo { get; set; }
}
使用系统反射;
.
.
.
///将基类实例的属性值复制到此对象。
私有void InitInhertedProperties(对象baseClassInstance)
{
foreach(baseClassInstance.GetType().GetProperties()中的PropertyInfo PropertyInfo)
{
对象值=propertyInfo.GetValue(baseClassInstance,null);
if(null!=value)propertyInfo.SetValue(this,value,null);
}
}

如果您希望拥有比复制反射属性更多的控制权,请尝试应用生成器模式。T可以是从基类派生的任何类

using System.Reflection;
.
.
.
/// <summary> copy base class instance's property values to this object. </summary>
private void InitInhertedProperties (object baseClassInstance)
{
    foreach (PropertyInfo propertyInfo in baseClassInstance.GetType().GetProperties())
    {
        object value = propertyInfo.GetValue(baseClassInstance, null);
        if (null != value) propertyInfo.SetValue(this, value, null);
    }
}
publicstatict BuildNew(BaseClass-BaseClass),其中T:BaseClass,new()
{
返回新的T
{
Property1=baseModel.Property1,
Property2=baseModel.Property2,
};
}

否。简短原因:没有单独的基本对象<代码>(对象)此==(对象)基始终为真。不过,也有通过反射(和其他方式)执行克隆/复制的方法。也许描述一下真正需要的是什么:)虽然问题并没有像现在这样询问反射(或复制构造函数),但我添加了标记,希望生成一个更有趣的相关问题列表。享受。(看起来特别有趣,可能是重复的)我没有太多地使用继承,所以很有可能有更好的方法来完成我真正想做的事情。基本上,我在winforms中使用wcf ria服务,但我使用的是Janusys ui套件,它要求我将服务代理创建的项转换为ITypelist。因此,我试图简单地继承服务代理生成的类型,以便创建ItemCollection:List,ItypedList@Eric利珀特:听起来他追求的甚至不是遗产,而是更好地组织他的物品或建筑。然而,表面上看,这似乎是最容易做到的事情。我需要所有的基本属性加上1或2个附加属性。我的目标很简单。基本上,在现实生活中,超级跑车可能有100%的性能。假设我现在维护一个超级跑车数据库。现在,我想从超级跑车继承,但我想通过我已经创建的超级跑车的基类,这纯粹是为了方便。当我已经创建了基本类型时,我不想手动设置100个属性。听起来你需要将SuperCar分解成更小的对象。然后超级星之间相同的对象可以共享。我更关心的是我对c#中继承的理解。在我看来,如果类A派生自类B,那么你应该能够在A上设置B。因此,如果你有一个类A的实例,你应该能够说A.B=new B();在我的梦想世界中,您可以像这样添加到类A以公开基B:public B GetSetBase{get{return base;set{base=value;}}我认为您不太了解继承。继承是关于为一组对象定义表单,而不是为特定对象定义特定细节。对于后者,您希望使用组合。假设我有一个person类,当然有数千个数据项表示person类。person类定义了一万个现在,我有一个person id,它与我要派生的特定person类关联,并创建一个从person继承的“John”类。现在我知道我要传入的特定person id,这将是“John”的基础