Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于泛型T的返回列表_C#_Generics - Fatal编程技术网

C# 基于泛型T的返回列表

C# 基于泛型T的返回列表,c#,generics,C#,Generics,我想将tenty列表转换为TDto列表 private List<TDto> ConvertUEntityToDto<TDto, TEntity>(IEnumerable<TEntity> entities) { if (entities is IEnumerable<Entity1>) { var result = new List<EntityDto1>

我想将
tenty
列表转换为
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;
    }
private List convertunitytodto(IEnumerable实体)
{
if(实体是IEnumerable)
{
var结果=新列表
foreach(实体中的var实体)
{
添加(_mapper.Map(实体));
}
返回结果;
}
else if(实体是IEnumerable)
{
var结果=新列表
foreach(实体中的var实体)
{
添加(_mapper.Map(实体));
}
返回结果;
}
返回null;
}
从上面的代码中,我得到一个错误:

错误CS0029无法将类型“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.List


如何从C#中的泛型方法动态返回
T
列表?

泛型的意义在于使用它们!if-else应位于泛型函数之前(另请参见下面的编辑)

这相当于:

private List<TDto> ConvertUEntityToDto<TDto, TEntity, Tmixed>(IEnumerable<Tmixed> entities)
    => entities.Where(e => e is TEntity).Select(e => _mapper.Map<TDto>(e));
private List convertunitytodto(IEnumerable实体)
=>实体。其中(e=>e是tenty)。选择(e=>\u mapper.Map(e));

实体DTO2和TDto之间的关系是什么?您将返回类型声明为
TDto
,但初始化
EntityDto2
的列表。将列表更改为
list
Tdto
是classm,但我在其中写入
where Tdto:class
从技术上讲仍然是相同的错误,
将结果返回为list
可能会解决您的问题。但是,正如@GiladGreen所指出的,有更好的方法来实现这种泛型映射,它通常包括一些泛型约束的使用来表示所涉及的类型之间的关系。创建这种泛型函数的好处是什么,似乎您已经在映射器实现中拥有了逻辑?只需使用实体即可。选择(e=>mapper.Map(e))?问题是您正在用泛型方法编写特定于类型的代码。您或者需要使用
TDto
使您的代码成为泛型代码,或者您必须要求编译器相信您的类型是兼容的,根据所涉及的类型执行
x作为TDto
(TDto)(object)x
。不错,但是您在Convert方法
Tdto2
中使用了,您能解释一下
Tdto2
Tdto
之间的关系吗?这是您代码的复制粘贴问题。现在看。:)如果您使用T和U(或任何字母),则会更容易。此外,您也可以将该方法设置为“return entities.Select(e=>_mapper.Map(e));”,即首先取消泛型方法的点。基本上,将此作为扩展方法是最有用的beneficial@JanneMatikainen扩展方法的想法可能不适用于这里!因为映射器(全局对象)将变成静态的(或者至少是引用类型参数),这是非常不线程安全的!另外,
实体
是一种引用类型:它本身会使函数不线程安全!但感谢Linq的想法。:)
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;
}
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));