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

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