使用派生 class 类型作为基础 class 的泛型操作的参数

Use derived class type as parameter of generic action of base class

我想通过一个委托来操作一个实例,它是 class 本身的一个 属性。委托的参数应该始终是实例本身(即使在派生的classes!)。

见下面的代码。我知道代码没有编译,因为我必须将 car1 强制转换为 car 类型,我正在寻找无需强制转换的解决方案。

代码

static void Main(string[] args)
{
    var car = new Car();
     car.VehicleManipulator = car1 => car1.SomeInt++;
     car.ManipulateVehicle();

    Console.WriteLine("end");
    Console.ReadLine();
}

internal class Vehicle
{
    public Action<Vehicle> VehicleManipulator { get; set; }

    public void ManipulateVehicle()
    {
        this.VehicleManipulator(this);
    }
}

internal class Car : Vehicle
{
    public int SomeInt { get; set; }
}

编辑: 更改代码!

我的问题是,是否有一个很好的解决方案可以仅在基础 class 中处理所有这些问题,但在操作中我想使用派生的 classes 而无需强制转换。

你很接近。 car.ManipulateVehicle(); 这一行得到 NullReferenceException 的原因是因为 VehicleManipulator 操作为空。

如您所见,基数 class 的 VehicleManipulator 属性 为空。

现在,如果您在分配操作时失败的行上方,它怎么可能为空?所以问题是在你派生的 class 汽车中,你有一个新的 different 属性 名称 VehicleManipulator 隐藏了基础的。因此,当您分配 car.VehicleManipulator 时,您实际上是在派生 class 中分配 属性 而不是在基础 class.

派生的 class 中删除它会起作用。

如果出于我尚不明白的原因,您确实希望在派生的 class 中保留 属性,那么在进行分配时,您可以指定要分配到基地 class 像这样:

如果您想避免转换,请将 Vehicle 通用化为:

class Vehicle<T> where T : Vehicle {
     Action<T> ManipulateVehicle { get; set; }
}

class Car : Vehicle<Car> {
    int SomeInt { get; set; }
}

它看起来有点奇怪,但这意味着如果你有一个汽车实例,那么操纵器可以在汽车上工作,如果你有一辆卡车,它可以在卡车上工作等等。车辆可能应该是抽象的。