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如何从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));