You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LuExpressionConverterEnumerable.cs 2.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using Luticate2.Auth.Dbo;
  6. using Luticate2.Auth.Dbo.Result;
  7. using Luticate2.Auth.Interfaces;
  8. namespace Luticate2.Auth.Business.Fields.DMEC
  9. {
  10. public class LuExpressionConverterEnumerable : ILuExpressionConverter
  11. {
  12. public IServiceProvider ServiceProvider { get; }
  13. public LuExpressionConverterEnumerable(IServiceProvider serviceProvider)
  14. {
  15. ServiceProvider = serviceProvider;
  16. }
  17. protected LuResult<Expression> ConvertOther(Type typeFrom, Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
  18. {
  19. var type = typeof(ILuExpressionConverter<>);
  20. var gtype = type.MakeGenericType(typeFrom);
  21. var converter = (ILuExpressionConverter) ServiceProvider.GetService(gtype);
  22. if (converter == null)
  23. {
  24. return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(), $"Could not get service: {gtype}>");
  25. }
  26. return converter.ConvertExpression(expressions, baseExpression, options);
  27. }
  28. public LuResult<Expression> ConvertExpression(Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
  29. {
  30. if (!expressions.Any())
  31. {
  32. return LuResult<Expression>.Ok(baseExpression);
  33. }
  34. var expression = expressions.Pop();
  35. if (expression is MethodCallExpression methodCallExpression)
  36. {
  37. var argumentsModel = new List<Expression>();
  38. foreach (var argumentDbo in methodCallExpression.Arguments)
  39. {
  40. var converter = new LuExpressionConverterVisitor(options, ServiceProvider);
  41. var result = converter.Visit(argumentDbo);
  42. argumentsModel.Add(result);
  43. }
  44. var newExpression = Expression.Call(baseExpression, methodCallExpression.Method, argumentsModel);
  45. return ConvertOther(newExpression.Type, expressions, newExpression, options);
  46. }
  47. return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(), "Not supported expression");
  48. }
  49. }
  50. }