如何获取已传递给方法的类

时间:2012-12-11 02:49:03

标签: c# .net

我有一个有9种不同属性的类,每个属性都是一个类

public class Vehicles
{
  Car car; //class
  Train train;  //class
  Plane plane; //class
}  

我将此Vehicle对象传递给方法

例如

var Vehicles = new Vehicles();
Vehicles.Car = new Car()
Object1.WorkOutTransport(vehicle)

我在Object1中需要做的是锻炼,“车辆”已经实例化而不使用switch语句并检查其他是否为空

这不是'家庭作业问题'......我已将其简化为仅说明问题

实际车辆类有9个可以实例化的类

4 个答案:

答案 0 :(得分:4)

我建议重新考虑你的设计。

为什么不让所有车辆类型都实现公共接口IVehicle,然后让您的Vehicles类有一个名为Vehicle的属性。

您只需要担心一件房产。

public Interface IVehicle 
{
    ... //Properties Common to all vehicles
}

public class Car : IVehicle
{
    ... //Properties to implement IVehicle
    ... //Properties specific to Car
}

public class Vehicles
{
    public IVehicle Vehicle { get; set; }
}

var vehicles = new Vehicles();
vehicles.Vehicle = new Car();
... //Do whatever else you need to do.

答案 1 :(得分:1)

假设只有一个非null,你可以这样做:

Vehicle instance = vehicle.Car ?? vehicle.Train ?? vehicle.Plane;

但如果您想对instance做一些有用的事情,则需要检查typeof(instance)并将其投放到合适的班级。

您可能只想考虑一个属性:

public class Vehicles
{
    public Vehicle VehicleInstance {get; set;}
}

并移动功能,以便您的WorkOutTransport方法可以作用于Vehicle实例,而不是关心它具有哪个子类。使用virtual类中的abstractVehicle方法,以及子类中的override方法。

答案 2 :(得分:0)

如果使用不同的属性,则无法避免检查哪个为null。我建议使用一个基类来识别类型或覆盖ToString方法。

答案 3 :(得分:0)

您可以强制接口继承者指定其类型:

enum VehicleType
{
    Passenger,
    Truck,
    // Etc...
}

public Interface IVehicle 
{
    VehicleType Type { get; }
    ... // Properties Common to all vehicles
}

public sealed class Truck : IVehicle
{
    // ... class stuff.

    // IVehicle implementation.
    public VehicleType Type { get { return VehicleType.Truck; } }
}

这将允许您不要查看每个类,而是要确切知道要播放的类型。

IVehicle vehicle = GetVehicle();

switch (vehicle.Type)
    case (VehicleType.Truck)
    {
        // Do whatever you need with an instance.
        Truck truck = (Truck)vehicle;
        break;
    }
    // ... Etc

除了switch之外,你还有其他任何一个appoarch。