Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取已传递给方法的类_C#_.net - Fatal编程技术网

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

C# 如何获取已传递给方法的类,c#,.net,C#,.net,我有一个具有9个不同属性的类,每个属性都是一个类 public class Vehicles { Car car; //class Train train; //class Plane plane; //class } 我将此车辆对象传递给一个方法 比如说 var Vehicles = new Vehicles(); Vehicles.Car = new Car() Object1.WorkOutTransport(vehicle) 在Object1中,我需要做的是在不使用

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

public class Vehicles
{
  Car car; //class
  Train train;  //class
  Plane plane; //class
}  
我将此车辆对象传递给一个方法

比如说

var Vehicles = new Vehicles();
Vehicles.Car = new Car()
Object1.WorkOutTransport(vehicle)
在Object1中,我需要做的是在不使用switch语句和检查其他语句是否为null的情况下确定实例化了哪个“vehicle”

这不是一个“家庭作业问题”…我简化了它,只是为了说明问题


实际车辆类有9个可能的类,如果您使用不同的属性,则可以实例化这些类,不能避免检查哪个为空或不为空。我建议使用具有标识类型的属性的基类或重写
ToString
方法。

我建议重新考虑您的设计

为什么不让您的所有车辆类型都实现一个通用接口
IVehicle
,然后让您的
车辆
类拥有一个名为
车辆
的属性

你只需要担心一个财产

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.

假设只有一个为非null,则可以执行以下操作:

Vehicle instance = vehicle.Car ?? vehicle.Train ?? vehicle.Plane;
但是如果你想对你的
实例做任何有用的事情
你必须检查
typeof(instance)
并将它转换到正确的类中

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

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

并移动功能,以便您的WorkOutTransport方法可以作用于
车辆
实例,而不必关心它有哪个子类。在
Vehicle
类中使用
virtual
abstract
方法,并在子类中覆盖它们。

您可以强制接口继承器指定它们的类型:

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

除了
开关

之外,你还有其他的方法吗
汽车
火车
飞机
,等等都有一个共同的父类?我觉得这是一个有共同的“车辆”父类的地方,我想@Blorgbeard的意思是,它们是否都继承了相同的基类?@kurasa每种车辆类型需要一个属性吗?如果get/set是公共属性,没有逻辑,它们应该是变量。只是好奇,为什么它们应该是变量?我同意@你的理由是什么?我会说恰恰相反。使用字段而不是属性会使您无法在自己喜欢的情况下使用它们。例如asp.NET中的序列化和数据绑定如果属性的getter/setter后面没有逻辑,并且两者都是公共的,那么为什么要在您只需要变量的情况下创建一个指向变量的指针呢@JefferyKhan是对的,如果你知道你为什么要使用它们,它们是很棒的。只是我见过很多房产没有真正用途的案例。