簡體   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