从单个端点 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' 转换为正确的类型...
我创建了一个通用方法,用于使用 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' 转换为正确的类型...