从单个端点 C# 获取通用列表

Get generic list from single EndPoint C#

我创建了一个通用方法,用于使用 EF

获取通用列表
public async Task<IEnumerable<T>> GetLookupListAsync<T>() where T : class, IBaseLookup
{
    return await _contextDb.GetDbSet<T>().ToListAsync();
}

然后从我的API,根据我需要的类型多次调用这个方法

[HttpGet]
[Route("title")]
public async Task<IActionResult> GetTitlePersona(DataSourceLoadOptions loadOptions)
{
    var title = await _lookupService.GetLookupListAsync<Title>();
    return Ok(DataSourceLoader.Load(title , loadOptions));
}

[HttpGet]
[Route("Test")]
public async Task<IActionResult> GetTestPersona(DataSourceLoadOptions loadOptions)
{
    var test = await _lookupService.GetLookupListAsync<Test>();
    return Ok(DataSourceLoader.Load(test, loadOptions));
}

有没有办法创建一个 EndPoint,而不是创建 N 个做同样事情的 EndPoint?

一种简单的方法是创建一个带有种类变量的方法,并为不同的查找设置一个开关,例如:

[HttpGet]
[Route("GetData")]
public async Task<IActionResult> GetData(string kind, DataSourceLoadOptions loadOptions)
{
    if (kind == "Title")
    {
        var result = await _lookupService.GetLookupListAsync<Title>();
        return Ok(DataSourceLoader.Load(result, loadOptions));
    }
    else if (kind == "Test")
    {
        var result = await _lookupService.GetLookupListAsync<Test>();
        return Ok(DataSourceLoader.Load(result, loadOptions));
    }
}

反射是可能的:

[HttpGet]
[Route("GetData")]
public async Task<IActionResult> GetData(string kind, DataSourceLoadOptions loadOptions)
{
    string namespace = "namespace";
    Type type = Type.GetType($"{namespace}.{kind}");

    MethodInfo method = typeof(_lookupService).GetMethod(nameof(_lookupService.GetLookupListAsync), BindingFlags.NonPublic | BindingFlags.Instance);
    MethodInfo genericMethod = method.MakeGenericMethod(type);
    var task = (Task)genericMethod.Invoke(this);
    await task;
    var resultProperty = task.GetType().GetProperty("Result");
    var result = resultProperty.GetValue(task)
    return Ok(DataSourceLoader.Load(result, loadOptions));
}

您必须使用 'title' 和 'test' 所在的命名空间来设置命名空间,而且您可能必须将 'result' 转换为正确的类型...