gpt4 book ai didi

c# - 在单一方法中克隆派生类型

转载 作者:行者123 更新时间:2023-11-30 21:39:34 24 4
gpt4 key购买 nike

我有一个非抽象基类 Vehicle,它具有三个派生类型。

  • 汽车
  • 摩托车
  • 拖拉机

我正在查看名为 VehicleBuilder 的服务它将有一个方法 CloneVehicle,它接受 Vehicle 类型的参数并返回所有三个派生类型的克隆对象。

这是我的CloneVehicle

public Vehicle CloneVehicle (Vehicle v)
{
var newVehicle = ClonebaseVehicle(v); // Clones all the types in the Base class
if(Vehicle.Type == Vehicles.Tractor)
{
// Clone individual fields
var tractor = new Tractor();
tractor = newVehicle as Tractor;
tractor.TractorCapacity = 50 ; // tractor is coming null here
return tractor;
}
}

我想重用 ClonebaseVehicle 并且无法创建构造函数,因为这些类来自不同的 DLL。我可以使用基类引用克隆派生对象的任何其他方式?

我无法更改 Vehicle 类或其任何派生类以在其中创建抽象方法

最佳答案

在您的 CloneBaseVehicle 方法中,您应该提供基类中的所有成员。如果有很多成员,您也可以使用反射来执行此操作:

Vehicle CloneBaseVehicle(Vehicle v)
{
Tractor t;
switch v.Type
{
case Vehicles.Tractor:
t = new Tractor();
case Vehicles.Car:
t = new Car();
case Vehicles.Motorcycle:
t = new Motorcycle();
}

// now copy the common properties
t.MyProperty = v.MyProperty;
t.AnotherProperty = v.AnotherProperty;

return t;
}

public Vehicle CloneVehicle (Vehicle v)
{
var newVehicl = CloneBaseVehicle();

switch(v.Type)
{
case(Vehicles.Tractor):
var tractor = newVehicle as Tractor;
tractor.TractorCapacity = 50 ;
break;
case Car:
...
break;
}
return newVehicle;
}

CloneBaseVehicle 的基于反射的方法可能如下所示:

Vehicle CloneBaseVehicle(Vehicle v)
{
Tractor t;
switch v.Type
{
case Vehicles.Tractor:
t = new Tractor();
case Vehicles.Car:
t = new Car();
case Vehicles.Motorcycle:
t = new Motorcycle();
}

var properties = typeof(Vehicle).GetProperties();
foreach(var p in properties)
p.SetValue(t, v.GetValue(p));

return t;
}

无论您选择这两种方法中的哪一种,您都应该意识到,当从现有的 Car 创建 Tractor 时,您当然会丢失所有特殊信息仅存在于 Car 中。

关于c# - 在单一方法中克隆派生类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45159535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com