非通用委托的适配器

杰瑞克·马祖(Jarek Mazur)

我有一个通用类:

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>>
弗拉德

如果我正确理解了您的问题,我会这样做:

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);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章