Общие ограничения параметров метода расширения - PullRequest
0 голосов
/ 28 мая 2019

Я создаю метод расширения до IQueryable, чтобы autopper передавал стандартный параметр.Хотя приведенный ниже код работает, кажется немного излишним указывать тип TSource при вызове этого метода (как в приведенном ниже коде вызова) .... т.е. необходимо указывать <Item, в вызове метода, когда он уже знаеттип entityQuery - Item.

. Я не эксперт в обобщениях, но мне интересно, есть ли способ удалить эту избыточность во время вызова, но все же квалифицировать TSource как нуждающегося в соответствиик интерфейсу IAuditStampsViewModel?

Вызов

public IQueryable<ItemViewModel> ConvertClassToViewModel(IQueryable<Item> entityQuery)
{
    return entityQuery.ProjectToPassUserTimeOffset<Item, ItemViewModel>();
}

Определение метода расширения

public static class AutoMapperExtensions
{
    public static IQueryable<TDestination> ProjectToPassUserTimeOffset<TSource, TDestination>(this IQueryable<TSource> entityQuery)
        where TSource : class, IAuditStampsViewModel, new()
    {
        return entityQuery.ProjectTo<TDestination>(
            new { intMinutesOffset = TimeUtilities.UserTimeZoneUTCOffsetMinutes() }
        );
    }
}

1 Ответ

1 голос
/ 28 мая 2019

Можете ли вы просто ограничить IAuditStampsViewModel?Тогда вы могли бы написать:

public static class Extensions
{
    public static IQueryable<TDestination> ProjectToPassUserTimeOffset<TDestination>(this IQueryable<IAuditStampsViewModel> entityQuery)
    {
        return entityQuery.ProjectTo<TDestination>(new {intMinutesOffset=TimeUtilities.UserTimeZoneUTCOffsetMinutes()});
    }
}

Вызывающая сторона будет:

public IQueryable<ItemViewModel> ConvertClassToViewModel(IQueryable<Item> entityQuery)
{
    return entityQuery.ProjectToPassUserTimeOffset<ItemViewModel>();
}
...