代码之家  ›  专栏  ›  技术社区  ›  Junior

Lambda类型参数必须派生自系统。委派

  •  0
  • Junior  · 技术社区  · 6 年前

    在一个 C#

    我发现了 magic Gist var lambda = ... 一直抛出以下错误

    Lambda类型参数必须派生自系统。委派

    这是密码

    public static IQueryable<dynamic> ToDynamic<T>(this IQueryable<T> query, IEnumerable<String> fields)
    {
        var pocoType = typeof(T);
    
        var itemParam = Expression.Parameter(pocoType, "x");
        var members = fields.Select(f => Expression.PropertyOrField(itemParam, f));
        var addMethod = typeof(IDictionary<string, object>).GetMethod(
                    "Add", new Type[] { typeof(string), typeof(object) });
    
    
        var elementInits = members.Select(m => Expression.ElementInit(addMethod, Expression.Constant(m.Member.Name), Expression.Convert(m, typeof(object))));
    
        var expando = Expression.New(typeof(ExpandoObject));
        var lambda = Expression.Lambda<Expression<Func<T, dynamic>>>(Expression.ListInit(expando, elementInits), itemParam);
    
        return query.Select(lambda.Compile());
    }
    

    1 回复  |  直到 6 年前
        1
  •  0
  •   Alexander    6 年前

    Expression.Lambda<T> 表达 T lambda类型参数 那个 必须派生自系统。委派 . 所以你只需要去掉包装 Expression Compile 从那以后 IQueryable Expression<Func<T, F>> 而不是 Func<T, F> IEnumerable

    //..
    var lambda = Expression.Lambda<Func<T, dynamic>>(Expression.ListInit(expando, elementInits), itemParam);
    
    return query.Select(lambda);