考虑以下函数:
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
接口强制执行此操作?
您可以使用类的名称而不是静态的
enum
。这样,您在添加接口的新实现时无需更改工厂。
public IVehicleProcessor GetVehicle(string typeName, string regNo)
{
var type = whateverAssembly.GetType(typeName);
return (IVehicleProcessor) Activator.CreateInstance(type);
}
您还应该检查找到的类型是否实现了接口,例如:
if(type.GetInterface(nameof(IVehicleProcessor)) != null) ...