TypeExtensions.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using System.Reflection;
  2. using ClosedXML.Excel;
  3. namespace ExcelORM;
  4. public static class TypeExtensions
  5. {
  6. // Borrowed from https://github.com/ClosedXML/ClosedXML/blob/develop/ClosedXML/Excel/XLCellValue.cs#L361
  7. public static object? ToObject(this XLCellValue value)
  8. {
  9. return value.Type switch
  10. {
  11. XLDataType.Blank => null,
  12. XLDataType.Boolean => value.GetBoolean(),
  13. XLDataType.Number => value.GetNumber(),
  14. XLDataType.Text => value.GetText(),
  15. XLDataType.Error => value.GetError(),
  16. XLDataType.DateTime => value.GetDateTime(),
  17. XLDataType.TimeSpan => value.GetTimeSpan(),
  18. _ => throw new InvalidCastException()
  19. };
  20. }
  21. public static Type ValueType(this XLCellValue value)
  22. {
  23. return value.Type switch
  24. {
  25. XLDataType.Blank => typeof(string),
  26. XLDataType.Boolean => typeof(bool),
  27. XLDataType.Number => typeof(double?),
  28. XLDataType.Text => typeof(string),
  29. XLDataType.DateTime => typeof(DateTime?),
  30. XLDataType.TimeSpan => typeof(TimeSpan?),
  31. _ => throw new InvalidCastException()
  32. };
  33. }
  34. public static void SetPropertyValue<T>(this T currentObject, PropertyInfo property, XLCellValue value)
  35. {
  36. var valueToSet = value.ToObject();
  37. if (valueToSet == null) return;
  38. try
  39. {
  40. property.SetValue(currentObject, valueToSet);
  41. }
  42. catch
  43. {
  44. valueToSet = value.ToString();
  45. property.SetValue(currentObject, valueToSet);
  46. }
  47. }
  48. }