dto.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package binding
  2. import (
  3. "git.sxidc.com/go-framework/baize/domain"
  4. "git.sxidc.com/go-framework/baize/infrastructure/logger"
  5. "git.sxidc.com/go-framework/baize/tag/assign"
  6. "git.sxidc.com/go-tools/utils/reflectutils"
  7. "git.sxidc.com/service-supports/fserr"
  8. "reflect"
  9. )
  10. type DTO interface{}
  11. func AssignDTOToDomainObject(dto DTO, domainObject domain.Object) error {
  12. return assign.DefaultUsage(dto, domainObject)
  13. }
  14. func Field[T any](dto DTO, fieldName string) T {
  15. var zero T
  16. fieldValue, err := getDTOFieldValue(dto, fieldName)
  17. if err != nil {
  18. logger.GetInstance().Error(err)
  19. return zero
  20. }
  21. if !fieldValue.IsValid() {
  22. err := fserr.New("dto字段" + fieldName + "无法赋值")
  23. logger.GetInstance().Error(err)
  24. return zero
  25. }
  26. retValue, ok := fieldValue.Interface().(T)
  27. if !ok {
  28. err := fserr.New("dto字段" + fieldName + "无法转换类型")
  29. logger.GetInstance().Error(err)
  30. return zero
  31. }
  32. return retValue
  33. }
  34. func ToConcreteDTO[T DTO](object DTO) T {
  35. concrete, ok := object.(T)
  36. if !ok {
  37. logger.GetInstance().Error(fserr.New("DTO转化失败"))
  38. var zero T
  39. return zero
  40. }
  41. return concrete
  42. }
  43. func getDTOFieldValue(dto DTO, fieldName string) (*reflect.Value, error) {
  44. if dto == nil {
  45. return nil, fserr.New("dto为nil")
  46. }
  47. dtoValue := reflect.ValueOf(dto)
  48. if reflectutils.IsValueStructOrStructPointer(dtoValue) {
  49. return nil, fserr.New("dto必须是结构或结构指针")
  50. }
  51. fieldValue := reflectutils.PointerValueElem(dtoValue).FieldByName(fieldName)
  52. return &fieldValue, nil
  53. }