dto.go 1.4 KB

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