TypeExtensions.cs 1.8 KB

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