【问题标题】:Generic extension method parameter restrictions泛型扩展方法参数限制
【发布时间】:2023-03-20 23:05:02
【问题描述】:

我正在为IQueryable 创建一个扩展方法,以便自动映射器传入标准参数。尽管下面的代码有效,但在调用此方法时必须指定 TSource 类型似乎有点多余(如下面的调用代码)......即当它已经知道entityQuery 的类型是Item 时,必须在方法调用中指定<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() }
        );
    }
}

【问题讨论】:

  • 您必须添加 TDestinatino 类型的参数,以便它也可以推断它,因为它目前是推断泛型类型的全部或全部。

标签: c# generics extension-methods


【解决方案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>();
}

【讨论】:

    猜你喜欢
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多