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.

LuObjectConverterDescriptorIdentity.cs 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Linq.Expressions;
  4. using System.Reflection;
  5. using Luticate2.Auth.Utils.Business.ExpressionConverter;
  6. using Luticate2.Auth.Utils.Interfaces;
  7. namespace Luticate2.Auth.Utils.Business.ObjectConverterDescriptor
  8. {
  9. public class LuObjectConverterDescriptorIdentity : ILuObjectConverterDescriptorIdentity
  10. {
  11. public LambdaExpression GetMemberValueExpression(MemberInfo memberInfo, LuExpressionConverterOptions options)
  12. {
  13. var isStatic = false;
  14. if (memberInfo is FieldInfo fieldInfo)
  15. {
  16. isStatic = fieldInfo.IsStatic;
  17. }
  18. else if (memberInfo is PropertyInfo propertyInfo)
  19. {
  20. isStatic = propertyInfo.GetAccessors(true)[0].IsStatic;
  21. }
  22. var param = Expression.Parameter(memberInfo.DeclaringType);
  23. var memberExpression = Expression.MakeMemberAccess(isStatic ? null : param, memberInfo);
  24. var lambda = Expression.Lambda(memberExpression, param);
  25. return lambda;
  26. }
  27. public LambdaExpression GetMethodValueExpression(MethodInfo methodInfo, LuExpressionConverterOptions options)
  28. {
  29. var lambdaParams = new List<ParameterExpression>
  30. {
  31. Expression.Parameter(methodInfo.DeclaringType) // TODO what if DeclaringType is static class
  32. };
  33. var methodParams = methodInfo.GetParameters().Select(x => Expression.Parameter(x.ParameterType)).ToList();
  34. lambdaParams.AddRange(methodParams);
  35. var methodCallExpression = Expression.Call(methodInfo.IsStatic ? null : lambdaParams[0], methodInfo, methodParams);
  36. var lambda = Expression.Lambda(methodCallExpression, lambdaParams);
  37. return lambda;
  38. }
  39. }
  40. }