首页 > 解决方案 > C#:调用泛型方法名,该方法名又会根据变量的内容调用其他方法

问题描述

我知道你在想什么……“这是

然而事实并非如此。

设想

我有两个具有相同类型数据的生产系统,它们都有自己的 API。不幸的是,这些系统的一些 API 调用是不同的,有些是相同的。我想创建一个通用接口/翻译层,它将通用调用转换为被查询系统的相应调用

在启动期间,集成将检查它需要连接到哪个版本的生产系统并将该值存储在变量中。当我调用“GetVehicle”时,我想根据先前定义的变量的值自动将此请求转换为“GetTruck”或“GetCar”。

下面是我想要完成的一个简短的伪代码示例。

注意:如果您想先阅读问题,可以跳到页面底部。

会有一个枚举

public enum TypesOfVehicles
{
    Commercial,
    Residential
}

主程序将实例化对象并设置变量,然后对实例化对象执行一些操作。

internal static class Program
{
    static void Main(string[] args)
    {
        var doStuffWithVehicles = new DoStuffWithVehicles();
    
        doStuffWithVehicles.TypeOfVehicle = TypesOfVehicles.Commercial;
        
        var myTruck = doStuffWithVehicles.GetVehicle(1);
        
        doStuffWithVehicles.TypeOfVehicle = TypesOfVehicles.Residential;
        
        var myCar = doStuffWithVehicles.GetVehicle(1);
    }
}

DoStuffWithVehicles 将是两个生产系统的“中间件/翻译”层。需要映射的方法实际上不止两种?

public class DoStuffWithVehicles
{
    public TypesOfVehicles TypeOfVehicle { get; set; }
    
    public T GetVehicle(int id)
    {
        switch (TypeOfVehicle)
        {
            case TypesOfVehicles.Commercial:
                return HeavyVehicle.GetTruck(id);
                break;
            case TypesOfVehicles.Residential:
                return LightVehicle.GetCar(id);
                break;
        }
    }
    
    public int GetWheels(int id)
    {
        switch (TypeOfVehicle)
        {
            case TypesOfVehicles.Commercial:
                return HeavyVehicle.GetWheels(id);
                break;
            case TypesOfVehicles.Residential:
                return LightVehicle.GetWheels(id);
                break;
        }
    }
}

生产系统类看起来像这样

public class HeavyVehicle
{
    public T GetTruck(int vehicleId)
    {
        return commercialContext.Query<HeavyVehicleObj>().Where(x => x.id == vehicleId);
    }
    
    public int GetWheels(int vehicleId)
    {
        return commercialContext.Query<HeavyVehicleObj>().Where(x => x.id == vehicleId).Select(x => x.nrOfWheels).FirstOrDefault();
    }
}

public class LightVehicle
{
    public T GetCar(int id)
    {
        return residentialContext.Query<LightVehicleObj>().Where(x => x.id == id);
    }
    
    public T GetWheels(int id)
    {
        return residentialContext.Query<LightVehicleObj>().Where(x => x.id == vehicleId).Select(x => x.nrOfWheels).FirstOrDefault();
    }
}

问题 有没有一种方法可以构建这种类型的接口/翻译层,而不必为两个生产系统 API 中存在的每个方法都创建一个开关?

由于反射的性能影响(系统每秒执行 100 次事务,并且所有这些事务都包含一个 SQL 组件),它不是一个选项。

标签: c#delegates

解决方案


推荐阅读