1

我想将列表转换TEntityTDto.

    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# 中的泛型方法动态返回列表?

4

1 回答 1

2

泛型的意义就是使用它们!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));
于 2020-02-17T12:31:47.683 回答