【发布时间】:2020-02-17 12:18:07
【问题描述】:
我想将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
”隐式转换为“System.Collections.Generic.List ”
如何从 C# 中的泛型方法动态返回 T 列表?
【问题讨论】:
-
EntityDto2和TDto是什么关系?您声明返回类型为TDto,但初始化EntityDto2列表。将列表更改为List<TDto> -
Tdto是类但我写where TDto : classstill 相同的错误 -
从技术上讲,
return result as List<TDto>可能会解决您的问题。但是,正如@GiladGreen 所指出的,有更好的方法来实现这种泛型映射,它通常包括一些泛型约束的使用来表示所涉及的类型之间的关系。 -
制作这个通用函数有什么好处,好像你已经在映射器实现中拥有了逻辑?并且可以只使用entities.Select(e => _mapper.Map
(e)); ? -
问题是您正在用泛型方法编写特定于类型的代码。您要么需要通过使用
TDto来使您的代码在通用内部,要么您必须要求编译器相信您的类型是兼容的,通过执行x as TDto或(TDto)(object)x,具体取决于类型参与。