Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#表达式Lambda to Func<;T>;从字符串_C#_Linq_Expression - Fatal编程技术网

c#表达式Lambda to Func<;T>;从字符串

c#表达式Lambda to Func<;T>;从字符串,c#,linq,expression,C#,Linq,Expression,我尝试从字符串实现e动态Funx表达式 Expression<Func<CustomerDto, object>> expr = (src) => src.Customer.Id; Func<CustomerDto, object> delg = expr.Compile(); var id = delg.Invoke(customerListDtos[0]); public Expression<Func<T, object>

我尝试从字符串实现e动态Funx表达式

Expression<Func<CustomerDto, object>> expr = (src) => src.Customer.Id;
Func<CustomerDto, object> delg = expr.Compile();
var id = delg.Invoke(customerListDtos[0]);
    public Expression<Func<T, object>> GetLambda<T>(string property)
    {

        var param = Expression.Parameter(typeof(T), "p");
        Expression body = param;
        foreach (var member in property.Split('.'))
        {
            body = Expression.PropertyOrField(body, member);
        }
        //return Expression.Lambda(body, param);

        //Expression parent = Expression.Property(param, property);
        Expression parent = Expression.Lambda(body, param);
        //if (!parent.Type.IsValueType)
        //{
        //    return Expression.Lambda<Func<T, object>>(parent, param);
        //}
        var convert = Expression.Convert(parent, typeof(object));
        return Expression.Lambda<Func<T, object>>(convert, param);
    }

您调用了两次
Expression.Labmda
,实际上是将一个func包装成另一个func。请尝试以下方法:

public static Expression<Func<T, object>> GetLambda<T>(string property) {
    var param = Expression.Parameter(typeof(T), "p");
    Expression body = param;
    foreach (var member in property.Split('.')) {
        body = Expression.PropertyOrField(body, member);
    }
    var convert = Expression.Convert(body, typeof(object));
    return (Expression<Func<T, object>>) Expression.Lambda(convert, param);
}
公共静态表达式GetLambda(字符串属性){
var param=表达式参数(类型(T),“p”);
表达式body=param;
foreach(property.Split('.')中的变量成员){
body=Expression.PropertyOrField(body,member);
}
var convert=Expression.convert(body,typeof(object));
return(Expression)Expression.Lambda(convert,param);
}

是否缺少调用?
{Method = {Int64 lambda_method(System.Runtime.CompilerServices.Closure, ef.Customer.CustomerDto)}}
public static Expression<Func<T, object>> GetLambda<T>(string property) {
    var param = Expression.Parameter(typeof(T), "p");
    Expression body = param;
    foreach (var member in property.Split('.')) {
        body = Expression.PropertyOrField(body, member);
    }
    var convert = Expression.Convert(body, typeof(object));
    return (Expression<Func<T, object>>) Expression.Lambda(convert, param);
}