Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

LuObjectConverterLists.cs 3.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Collections.ObjectModel;
  5. using Luticate2.Auth.Utils.Business.Converters;
  6. using Luticate2.Auth.Utils.Dbo;
  7. using Luticate2.Auth.Utils.Dbo.Fields;
  8. using Luticate2.Auth.Utils.Dbo.Result;
  9. using Luticate2.Auth.Utils.Interfaces;
  10. namespace Luticate2.Auth.Utils.Business.ObjectConverter
  11. {
  12. public abstract class LuObjectConverterLists : ILuObjectConverter
  13. {
  14. protected IServiceProvider ServiceProvider { get; }
  15. public LuObjectConverterLists(IServiceProvider serviceProvider)
  16. {
  17. ServiceProvider = serviceProvider;
  18. }
  19. protected abstract Type GetListType();
  20. public LuResult<object> Convert(object srcObj, LuPartialFieldsDbo fields, LuConvertersOptions options)
  21. {
  22. if (srcObj is IEnumerable enumerable)
  23. {
  24. var listType = GetListType();
  25. var listTypeTo = options.TypeConverter.ConvertType(srcObj.GetType().GetGenericArguments()[0]);
  26. var glistType = listType.MakeGenericType(listTypeTo);
  27. var collection = options.Allocator.GetInstance(glistType);
  28. foreach (var obj in enumerable)
  29. {
  30. object convertedObj = null;
  31. if (obj != null)
  32. {
  33. var typeFrom = obj.GetType();
  34. var typeTo = options.TypeConverter.ConvertType(typeFrom);
  35. // TODO Handle converter == null
  36. var converter = LuObjectConverterUtils.GetObjectConverter(ServiceProvider, typeFrom, typeTo);
  37. var convertResult = converter.Convert(obj, fields, options);
  38. if (!convertResult)
  39. {
  40. return convertResult;
  41. }
  42. convertedObj = convertResult.Data;
  43. }
  44. var methodInfo = collection.GetType().GetMethod(nameof(ICollection<object>.Add));
  45. methodInfo.Invoke(collection, new []{convertedObj});
  46. }
  47. return LuResult<object>.Ok(collection);
  48. }
  49. else
  50. {
  51. return LuResult<object>.Error(LuStatus.InputError.ToInt(), $"Could not convert {nameof(srcObj)} to {nameof(IEnumerable)}");
  52. }
  53. }
  54. }
  55. public class LuObjectConverterList : LuObjectConverterLists
  56. {
  57. public LuObjectConverterList(IServiceProvider serviceProvider) : base(serviceProvider)
  58. {
  59. }
  60. protected override Type GetListType()
  61. {
  62. return typeof(List<>);
  63. }
  64. }
  65. public class LuObjectConverterCollection : LuObjectConverterLists
  66. {
  67. public LuObjectConverterCollection(IServiceProvider serviceProvider) : base(serviceProvider)
  68. {
  69. }
  70. protected override Type GetListType()
  71. {
  72. return typeof(Collection<>);
  73. }
  74. }
  75. }