У меня есть следующий методПреобразовать строку Func <T,Object>
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
является строкой, как лямбда-выражения (например: 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
Edit: Method Signature
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);
}
}
С уважением
Определение «не работает» – Clint
Просто для записи, вы можете использовать Predicate вместо Func , когда ваш тип возвращаемого значения является логическим. –
msmolcic
@msmolcic 'Predicate' predates' Func', вполне приемлемо использовать более универсальный 'Func'. См. Например, предложение LINQ [Where] (https://msdn.microsoft.com/en-us/library/bb534803 (v = vs.100) .aspx) 'public static IEnumerable Где ( \t этот IEnumerable источник , \t Func предикат ) '. Все LINQ использует 'Func ' и нигде не использует 'Predicate '. –