dto.go 1.4 KB

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