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.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using System;
  2. using Luticate2.Auth.Utils.Business.Converters;
  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. public LuResult<object> Convert(object srcObj, LuPartialFieldsDbo fields, LuConvertersOptions options)
  18. {
  19. // TODO Check if this is correct
  20. if (srcObj == null)
  21. {
  22. return LuResult<object>.Ok(default(TTypeTo));
  23. }
  24. // TODO Handle descriptor == null
  25. var descriptor = ServiceProvider.GetService<ILuObjectConverterDescriptor<TTypeTo, TTypeFrom>>();
  26. var typeTo = typeof(TTypeTo);
  27. var dstObj = options.Allocator.GetInstance(typeTo);
  28. foreach (var memberInfo in typeTo.GetProperties())
  29. {
  30. // TODO check if field is included in fields
  31. // TODO Handle srcPropExpression == null
  32. var srcPropExpression = descriptor.GetMemberValueExpression(memberInfo, options);
  33. var srcPropDelegate = srcPropExpression.Compile();
  34. var srcProp = srcPropDelegate.DynamicInvoke(srcObj);
  35. var srcType = srcProp != null ? srcProp.GetType() : srcPropExpression.ReturnType;
  36. var dstType = memberInfo.GetUnderlyingType();
  37. // TODO Handle objectConverter == null
  38. var objectConverter = LuObjectConverterUtils.GetObjectConverter(ServiceProvider, srcType, dstType);
  39. var dstPropResult = objectConverter.Convert(srcProp, fields, options);
  40. if (!dstPropResult)
  41. {
  42. return dstPropResult;
  43. }
  44. var dstProp = dstPropResult.Data;
  45. var result = LuExpressionUtils.SetValueFromMember(memberInfo, dstObj, dstProp);
  46. if (!result)
  47. {
  48. return result.To<object>();
  49. }
  50. }
  51. return LuResult<object>.Ok(dstObj);
  52. }
  53. }
  54. }