c# - 将字符串转换为 Func<T,Object>

标签 c# linq lambda expression-trees

我有以下方法

     public List<ServicesLogModel> Paging(Func<ServicesLogModel, bool> condition, string columnOrder, bool? orderDescending, int? pageIndex, int? pageSize, out int total)
    {
         return _mongoRepository.Paging(condition, order => order.Message, orderDescending.Value, pageIndex.Value, pageSize.Value, out total);
    }

columnOrder参数是一个字符串作为 lambda 表达式(例如:order => order.Message),我必须将其转换为 Func<T, object>

我正在尝试 Expression.Parameter

 var parm = Expression.Parameter(typeof(ServicesLogModel), "order");

        var propName = Expression.Property(parm, columnOrder);

        Expression predicateBody = Expression.Assign(parm, propName);


        var test=Expression.Lambda<Func<ServicesLogModel, object>>(predicateBody, parm);

没用 错误:您不能使用类型为“System.String”的表达式来分配类型为“ServicesLogModel”

编辑:方法签名

public List<T> Paging(Func<T, bool> condition, Func<T, object> order, bool orderDescending, int pageIndex, int pageSize,out int total) 

调用方式

    [HttpGet]
    [Route("Admin/GetReaderConnectorLog/{Apikey}/{SecretKey}/{index}/{pagesize}/{orderAsc}/{columnOrder}")]
    public IActionResult GetReaderConnectorLog(string Apikey, string SecretKey, int? index, int? pagesize, bool? orderAsc, string columnOrder)
    {
        try
        {
            _userService.BeginTransaction();
            //  _webApiHelper.ValidateApiKey(Apikey, SecretKey, Context, _userService, true);
            int total;
            //TEST
            var listModel = _connectorLogService.Paging(_ => true, $"order => order.{columnOrder}", orderAsc, index, pagesize, out total);
            _userService.Commit();
            return _webApiHelper.OkResponse($"{_appSettings.Options.UserTag}[Send List User]", Context, new PaginationModel<ServicesLogModel> { ListData = listModel, Total = total, Apikey = Apikey, SecretKey = SecretKey });
        }
        catch (Exception e)
        {
            _userService.Rollback();
            return _webApiHelper.ResolveException(Context, e);
        }
    }

问候

最佳答案

嗯,最后的解决方案是这样的

public Func<T, object> GetLambda<T>(string property)
    {
        var param = Expression.Parameter(typeof(T), "p");

        Expression parent = Expression.Property(param, property);

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

关于c# - 将字符串转换为 Func<T,Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32722731/

相关文章:

Linq 到 NHibernate : is it mature?

c# - 获取数据表中不同的日期

C++ 编写内联函数作为参数传递

c# - 在 ProcessRecord 中停止执行 cmdlet

c# - 使用比我需要调用的方法更少受约束的泛型类型实现接口(interface)

c# - 随机排序的长序列

C++ 如何将可变参数函数模板的参数包 -> 包装到 lambda 中

c# - 让玩家自由旋转游戏对象

c# - DocumentDB如何对_TS进行LINQ查询?

c# - 如何动态创建 lambda 表达式