c# - 基于泛型 T 的返回列表
问题描述
我想将列表转换TEntity
为TDto
.
private List<TDto> ConvertUEntityToDto<TDto, TEntity>(IEnumerable<TEntity> entities)
{
if (entities is IEnumerable<Entity1>)
{
var result = new List<EntityDto1>
foreach (var entity in entities)
{
result.Add(_mapper.Map<EntityDto1>(entity ));
}
return result;
}
else if (entities is IEnumerable<Entity2>)
{
var result = new List<EntityDto2>
foreach (var entity in entities)
{
result.Add(_mapper.Map<EntityDto2>(entity));
}
return result;
}
return null;
}
从上面的代码我得到一个错误:
错误 CS0029 无法将类型“System.Collections.Generic.List<EntityDto>”隐式转换为“System.Collections.Generic.List<TDto>”
如何T
从 C# 中的泛型方法动态返回列表?
解决方案
泛型的意义就是使用它们!if-else 应该在您的通用函数之前(另见下面的编辑)。
if (entities is IEnumerable<Entity1>)
ConvertUEntityToDto<TDto1, Entity1>(entities);
else if (entities is IEnumerable<Entity2>)
ConvertUEntityToDto<TDto2, Entity2>(entities);
else ; //do nothing
在ConvertUEntityToDto内部,它应该使用 T (TDto),如下所示:
private List<TDto> ConvertUEntityToDto<TDto, TEntity>(IEnumerable<TEntity> entities)
{
var result = new List<TDto>
foreach (var entity in entities)
{
result.Add(_mapper.Map<TDto>(entity));
}
return result;
}
错误是因为返回类型与函数的签名不匹配。
但我想提一下
您可以只传入一个列表,对其进行迭代,foreach
如果列表中的元素是 T 类型,则添加到您List<T>
返回的新元素中。
此外,您应该对 T有约束。
编辑:
我上面提到的,要返回列表的所有元素,仅与类型 TDto 匹配(并摆脱前面的 if-else 块),我们可以使用以下代码片段(通过System.Linq
在项目中引用)(感谢@Janne马蒂凯宁提到):
private List<TDto> ConvertUEntityToDto<TDto, TEntity, Tmixed>(IEnumerable<Tmixed> entities)
{
return entities.Where(e => e is TEntity).Select(e => _mapper.Map<TDto>(e));
}
这相当于:
private List<TDto> ConvertUEntityToDto<TDto, TEntity, Tmixed>(IEnumerable<Tmixed> entities)
=> entities.Where(e => e is TEntity).Select(e => _mapper.Map<TDto>(e));
推荐阅读
- sql - SQL - 在列中查找具有特定值组合的行
- python - TypeError 虽然形状相同:如果不是 (target.size() == input.size()): 'int' object is not callable
- spring - 请求被拒绝,因为在 tomcat 中部署 spring boot 应用程序时 URL 未规范化
- amazon-web-services - 如何使用 AWS CLI 根据给定的日期范围(如 8 月 8 日至 8 月 15 日)从 S3 存储桶下载选择性日期范围文件?
- tensorflow - 如果输出是单热向量,如何自定义深度学习模型?
- qt - QComboBox 样式表在 Ubuntu 16.04 LTS 上不起作用
- lua - 如何在 C lua 模块中调用
- r - init_nloptr.c:35:19:致命错误:nlopt.h:没有这样的文件或目录
- git - 如何对git状态输出进行排序
- python - 熊猫读取没有标头的 JSON 文件