dto.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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/service-supports/fserr"
  7. "reflect"
  8. )
  9. type DTO interface{}
  10. func AssignDTOToDomainObject(dto DTO, domainObject domain.Object) error {
  11. return assign.DefaultUsage(dto, domainObject)
  12. }
  13. func Field[T any](dto DTO, fieldName string) T {
  14. var zero T
  15. fieldValue, err := getDTOFieldValue(dto, fieldName)
  16. if err != nil {
  17. logger.GetInstance().Error(err)
  18. return zero
  19. }
  20. if !fieldValue.IsValid() {
  21. err := fserr.New("dto字段" + fieldName + "无法赋值")
  22. logger.GetInstance().Error(err)
  23. return zero
  24. }
  25. retValue, ok := fieldValue.Interface().(T)
  26. if !ok {
  27. err := fserr.New("dto字段" + fieldName + "无法转换类型")
  28. logger.GetInstance().Error(err)
  29. return zero
  30. }
  31. return retValue
  32. }
  33. func ToConcreteDTO[T DTO](object DTO) T {
  34. concrete, ok := object.(T)
  35. if !ok {
  36. logger.GetInstance().Error(fserr.New("DTO转化失败"))
  37. var zero T
  38. return zero
  39. }
  40. return concrete
  41. }
  42. func getDTOFieldValue(dto DTO, fieldName string) (*reflect.Value, error) {
  43. dtoType := reflect.TypeOf(dto)
  44. if dtoType.Kind() != reflect.Pointer {
  45. return nil, fserr.New("dto必须是结构指针类型")
  46. }
  47. if dtoType.Kind() == reflect.Pointer && dtoType.Elem().Kind() != reflect.Struct {
  48. return nil, fserr.New("dto必须是结构指针类型")
  49. }
  50. dtoValue := reflect.ValueOf(dto)
  51. if dtoType.Kind() == reflect.Pointer && !dtoValue.IsValid() {
  52. return nil, fserr.New("dto为nil")
  53. }
  54. fieldValue := dtoValue.Elem().FieldByName(fieldName)
  55. return &fieldValue, nil
  56. }