12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Linq.Expressions;
- using Luticate2.Auth.Dbo;
- using Luticate2.Auth.Dbo.Result;
- using Luticate2.Auth.Interfaces;
-
- namespace Luticate2.Auth.Business.Fields.DMEC
- {
- public class LuExpressionConverterEnumerable : ILuExpressionConverter
- {
- public IServiceProvider ServiceProvider { get; }
-
- public LuExpressionConverterEnumerable(IServiceProvider serviceProvider)
- {
- ServiceProvider = serviceProvider;
- }
-
- protected LuResult<Expression> ConvertOther(Type typeFrom, Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
- {
- var type = typeof(ILuExpressionConverter<>);
- var gtype = type.MakeGenericType(typeFrom);
- var converter = (ILuExpressionConverter) ServiceProvider.GetService(gtype);
- if (converter == null)
- {
- return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(), $"Could not get service: {gtype}>");
- }
-
- return converter.ConvertExpression(expressions, baseExpression, options);
- }
-
- public LuResult<Expression> ConvertExpression(Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
- {
- if (!expressions.Any())
- {
- return LuResult<Expression>.Ok(baseExpression);
- }
-
- var expression = expressions.Pop();
- if (expression is MethodCallExpression methodCallExpression)
- {
- var argumentsModel = new List<Expression>();
- foreach (var argumentDbo in methodCallExpression.Arguments)
- {
- var converter = new LuExpressionConverterVisitor(options, ServiceProvider);
- var result = converter.Visit(argumentDbo);
- argumentsModel.Add(result);
- }
-
- var newExpression = Expression.Call(baseExpression, methodCallExpression.Method, argumentsModel);
- return ConvertOther(newExpression.Type, expressions, newExpression, options);
- }
-
- return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(), "Not supported expression");
- }
- }
- }
|