dto.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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 {
  29. concrete, ok := object.(T)
  30. if !ok {
  31. logger.GetInstance().Error(fserr.New("DTO转化失败"))
  32. var zero T
  33. return zero
  34. }
  35. return concrete
  36. }
  37. func getDTOFieldValue(dto DTO, fieldName string) (*reflect.Value, error) {
  38. dtoType := reflect.TypeOf(dto)
  39. if dtoType.Kind() != reflect.Ptr {
  40. return nil, fserr.New("dto必须是结构指针类型")
  41. }
  42. if dtoType.Kind() == reflect.Ptr && dtoType.Elem().Kind() != reflect.Struct {
  43. return nil, fserr.New("dto必须是结构指针类型")
  44. }
  45. dtoValue := reflect.ValueOf(dto)
  46. if dtoType.Kind() == reflect.Ptr && !dtoValue.IsValid() {
  47. return nil, fserr.New("dto为nil")
  48. }
  49. fieldValue := dtoValue.Elem().FieldByName(fieldName)
  50. return &fieldValue, nil
  51. }