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.

LuObjectConverterPoco.cs 2.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System;
  2. using Luticate2.Auth.Utils.Business.ExpressionConverter;
  3. using Luticate2.Auth.Utils.Business.Utils;
  4. using Luticate2.Auth.Utils.Dbo.Fields;
  5. using Luticate2.Auth.Utils.Dbo.Result;
  6. using Luticate2.Auth.Utils.Interfaces;
  7. using Microsoft.Extensions.DependencyInjection;
  8. namespace Luticate2.Auth.Utils.Business.ObjectConverter
  9. {
  10. public class LuObjectConverterPoco<TTypeFrom, TTypeTo> : ILuObjectConverter<TTypeFrom, TTypeTo>
  11. {
  12. protected IServiceProvider ServiceProvider { get; }
  13. public LuObjectConverterPoco(IServiceProvider serviceProvider)
  14. {
  15. ServiceProvider = serviceProvider;
  16. }
  17. protected ILuObjectConverter GetObjectConverter(Type typeFrom, Type typeTo)
  18. {
  19. var type = typeof(ILuObjectConverter<,>);
  20. var gtype = type.MakeGenericType(typeFrom, typeTo);
  21. var converter = (ILuObjectConverter) ServiceProvider.GetService(gtype);
  22. if (converter == null && typeFrom == typeTo)
  23. {
  24. converter = (ILuObjectConverter) ServiceProvider.GetService(typeof(ILuObjectConverterIdentity));
  25. }
  26. return converter;
  27. }
  28. public LuResult<object> Convert(object srcObj, LuPartialFieldsDbo fields, LuExpressionConverterOptions options)
  29. {
  30. // TODO Check if this is correct
  31. if (srcObj == null)
  32. {
  33. return LuResult<object>.Ok(default(TTypeTo));
  34. }
  35. // TODO Handle descriptor == null
  36. var descriptor = ServiceProvider.GetService<ILuObjectConverterDescriptor<TTypeTo, TTypeFrom>>();
  37. var typeTo = typeof(TTypeTo);
  38. var dstObj = options.Allocator(typeTo);
  39. foreach (var memberInfo in typeTo.GetProperties())
  40. {
  41. // TODO check if field is included in fields
  42. // TODO Handle valueExpression == null
  43. var srcPropExpression = descriptor.GetMemberValueExpression(memberInfo, options);
  44. var srcPropDelegate = srcPropExpression.Compile();
  45. var srcProp = srcPropDelegate.DynamicInvoke(srcObj);
  46. var objectConverter = GetObjectConverter(srcProp.GetType(), memberInfo.GetUnderlyingType());
  47. var dstProp = objectConverter.Convert(srcProp, fields, options);
  48. if (!dstProp)
  49. {
  50. return dstProp;
  51. }
  52. var result = LuExpressionUtils.SetValueFromMember(memberInfo, dstObj, dstProp.Data);
  53. if (!result)
  54. {
  55. return result.To<object>();
  56. }
  57. }
  58. return LuResult<object>.Ok(dstObj);
  59. }
  60. }
  61. }