Адаптер для неуниверсального делегата - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть универсальный класс:

public class ProviderAdapter<TDto, TModel>
{
    public ProviderAdapter(IQueryable source, Func<TDto, TModel> mapping)
    {
      ... //not important
    }
}

и метод расширения:

public static class QueryableExtensions
{
    public static IQueryable<TModel> Map<TDto, TModel>(
        this IQueryable<TDto> query, Func<TDto, TModel> mapping)
    {
      var providerAdapter = new ProviderAdapter<TDto, TModel>(query, mapping);
      var result = new QueryableAdapter<TModel>(providerAdapter);
      return result;
    }
}

Теперь я хочу создать другой метод расширения для неуниверсального IQueryable:

public static class QueryableExtensions
{
    public static IQueryable<TModel> Map<TModel>(
        this IQueryable query, Func<dynamic, TModel> mapping)
    {
      //how to create ProviderAdapter instance having 
      //query.ElementType and mapping Func with dynamic?
      var providerAdapter = new ProviderAdapter<type from query.ElementType, TModel>(query, 
      new Func<type from query.ElementType, TModel> using mapping Func<dynamic,TModel>
    }
}

Возможно ли это?Я не уверен насчет типа параметра 'mapping' - я планировал создать новый Func, используя отражение, которое вызывает

Func<dynamic, TModel> 

, но преобразует первый параметр в query.ElementType.Возможно, параметр 'mapping' должен иметь тип

Expression<Func<dynamic, TModel>>

1 Ответ

0 голосов
/ 19 февраля 2019

Если я правильно понимаю вашу проблему, я бы пошел на это:

public static class QueryableExtensions2
{
    public static IQueryable<TModel> Map<TModel>(
        this IQueryable query, Func<dynamic, TModel> mapping)
    {
        var tdto = query.ElementType;
        var typedMapping =
            typeof(QueryableExtensions2).GetMethod(nameof(Wrap))
                                        .MakeGenericMethod(tdto, typeof(TModel))
                                        .Invoke(null, new object[] { mapping });

        var targetType = typeof(ProviderAdapter<,>)
                             .MakeGenericType(tdto, typeof(TModel));
        var instance = Activator.CreateInstance(targetType,
                                                new object[] { query, typedMapping });
        return (IQueryable<TModel>)instance;
    }

    static public Func<TDto, TModel> Wrap<TDto, TModel>(Func<dynamic, TModel> mapping) =>
        d => mapping(d);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...