繁体   English   中英

如何为ICollection定义扩展方法 <T> 其中T:IMyInterface,在方法定义中未指定T

[英]How to Define Extension Method for ICollection<T> where T : IMyInterface without Specifying T in the Method Definition

背景:我想在将DTO映射到实体时加入业务规则。 我认为将映射封装到扩展方法中是个不错的选择。

IEntityDto是所有可以直接映射到实体的DTO所实现的接口。

单个实例可以正常工作:

public static TEntity MapTo<TEntity>(this IEntityDto dto)
{
    ... Run Business Rules that don't require db access ...
    return AutoMapper.Mapper.Map<TEntity>(dto);
}

我也想以相同的方式扩展ICollection:

public static ICollection<TEntity> MapToCollection<TEntity>(this ICollection<IEntityDto> dtos)
{
    ... Run Business Rules that don't require db access ...
    return AutoMapper.Mapper.Map<ICollection<TEntity>>(dtos);
}

不幸的是,当将MapToCollection应用于IEntityDto的ICollection时,不会显示在上下文菜单上或进行编译。

我想让它起作用吗? 我是否只需要扩展ICollection,其中T是IEntityDto? 我希望在调用扩展方法时不必包括DTO类型。

public static ICollection<TEntity>MapToCollection<TDto,TEntity>(this ICollection<TDto> dtos) where TDto: IEntityDto
{
    ... Do Work and Return ...
}

上面的作品,但我希望从集合中推断出T。

谢谢!

实际上需要一种签名为

public static ICollection<TEntity> MapToCollection<TEntity, TEntityDto>(
    this ICollection<TEntityDto> dtos)
    where TEntityDto : IEntityDto

...但是这将迫使您同时指定两个类型参数,据我所知您不想这样做。

相反,您可以做两步,例如

public static class DtoExtensions
{
    public static CollectionMapper<TEntityDto> Map(this ICollection<TEntityDto> dtos)
        where TEntityDto : IEntityDto
    {
        return new CollectionMapper<TEntityDto>(dtos);
    }
}

public class CollectionMapper<TEntityDto> where TEntityDto : IEntityDto
{
    private readonly ICollection<TEntityDto> dtos;

    public CollectionMapper(ICollection<TEntityDto> dtos)
    {
        this.dtos = dtos;
    }

    public ICollection<TEntity> To<TEntity>()
    {
        // Business rules...
        return AutoMapper.Mapper.Map<ICollection<TEntity>>(dtos);
    }
}

您现在可以使用:

var result = collection.Map().To<FooEntity>();

Map调用推断TEntityDto ,您可以在To调用中指定TEntity

我假设发生这种情况是因为您要在其上调用此扩展方法的变量实际上不是ICollection<IEntityDto>类型的,而是ICollection<MyEntityDto>类型的。

尝试这个:

public static class ExtensionMethods
{
    public static ICollection<TEntity> MapToCollection<TEntity, TEntityDto>(
        this ICollection<TEntityDto> dtos) where TEntityDto : IEntityDto
    {
        return AutoMapper.Mapper.Map<ICollection<TEntity>>(dtos);
    }        
}

此方法接受通用ICollection<TEntityDto>而不是ICollection<IEntityDto> ,这使它适用于ICollection<MyEntityDto>

这是您将如何使用它:

Collection<MyEntityDto> collection = ...

var result = collection.MapToCollection<MyEntity, MyEntityDto>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM