通用扩展方法参数限制

时间:2019-05-28 17:56:27

标签: c# generics extension-methods

我正在为IQueryable创建一个扩展方法,以使自动映射器能够传递标准参数。尽管下面的代码可以工作,但是在调用此方法时必须指定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 个答案:

答案 0 :(得分:1)

您可以约束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>();
}