如何根据参数返回类型的对象?

问题描述 投票:0回答:1

考虑以下函数:

public IVehicleProcessor GetVehicle(VehicleType vehicleType, string regNo) {

    if (vehicleType == VehicleType.Car)
        return new CarProcessor(regNo);

    if (vehicleType == VehicleType.Van)
        return new VanProcessor(regNo);

    if (vehicleType == VehicleType.Truck)
        return new TruckProcessor(regNo);

    // the list goes on.

    return null;
}

然后在另一个(“子”)项目中

public enum VehicleType {
    Car,
    Van,
    Truck,
    // etc.
}

有没有办法重写这个方法,使其不依赖一堆

if
语句? (我并不是说只是将其更改为
switch
)。这段代码将进行一些自定义,假设我想添加一个总线,我希望能够创建一个
BusProcessor : IVehicleProcessor
并将
Bus
添加到
VehicleType
枚举和
GetVehicle()
只会知道该怎么做。也许使用反射什么的?

例如,我想也许将

VehicleType
作为
IVehicleProcessor
中的属性,以便每个“处理器”类将返回其自己的车辆类型,但我不知道如何从
GetVehicle()
访问该类型 -特别是因为它必须在实例化之前完成。也可以将其设为静态属性,但是如何使用
IVehicleProcessor
接口强制执行此操作?

c# design-patterns
1个回答
0
投票

您可以使用类的名称而不是静态的

enum
。这样,您在添加接口的新实现时无需更改工厂。

public IVehicleProcessor GetVehicle(string typeName, string regNo) 
{
    var type = whateverAssembly.GetType(typeName);
    return (IVehicleProcessor) Activator.CreateInstance(type);
}

您还应该检查找到的类型是否实现了接口,例如:

if(type.GetInterface(nameof(IVehicleProcessor)) != null) ...
© www.soinside.com 2019 - 2024. All rights reserved.