object.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package domain
  2. import (
  3. "git.sxidc.com/go-framework/baize/infrastructure/logger"
  4. "git.sxidc.com/go-tools/utils/reflectutils"
  5. "git.sxidc.com/service-supports/fserr"
  6. "reflect"
  7. )
  8. type Object interface{}
  9. func HasField(object Object, fieldName string) bool {
  10. return hasField(object, fieldName)
  11. }
  12. func SetField[T any](object Object, fieldName string, value T) {
  13. fieldValue, err := getFieldValue(object, fieldName)
  14. if err != nil {
  15. logger.GetInstance().Error(err)
  16. return
  17. }
  18. if !fieldValue.IsValid() || !fieldValue.CanSet() {
  19. err := fserr.New("object字段" + fieldName + "无法赋值")
  20. logger.GetInstance().Error(err)
  21. return
  22. }
  23. fieldValue.Set(reflect.ValueOf(value))
  24. }
  25. func Field[T any](object Object, fieldName string) (T, error) {
  26. var zero T
  27. fieldValue, err := getFieldValue(object, fieldName)
  28. if err != nil {
  29. return zero, err
  30. }
  31. if !fieldValue.IsValid() {
  32. err := fserr.New("object字段" + fieldName + "无法赋值")
  33. return zero, err
  34. }
  35. retValue, ok := fieldValue.Interface().(T)
  36. if !ok {
  37. return zero, err
  38. }
  39. return retValue, nil
  40. }
  41. func ToConcrete[T Object](object Object) T {
  42. concrete, ok := object.(T)
  43. if !ok {
  44. logger.GetInstance().Error(fserr.New("领域对象转化失败"))
  45. var zero T
  46. return zero
  47. }
  48. return concrete
  49. }
  50. func hasField(object Object, fieldName string) bool {
  51. if object == nil {
  52. return false
  53. }
  54. objectValue := reflect.ValueOf(object)
  55. if reflectutils.IsValueStructOrStructPointer(objectValue) {
  56. return false
  57. }
  58. fieldValue := reflectutils.PointerValueElem(objectValue).FieldByName(fieldName)
  59. if !fieldValue.IsValid() {
  60. return false
  61. }
  62. return true
  63. }
  64. func getFieldValue(object Object, fieldName string) (*reflect.Value, error) {
  65. if object == nil {
  66. return nil, fserr.New("object为nil")
  67. }
  68. objectValue := reflect.ValueOf(object)
  69. if reflectutils.IsValueStructOrStructPointer(objectValue) {
  70. return nil, fserr.New("object必须是结构或结构指针")
  71. }
  72. fieldValue := reflectutils.PointerValueElem(objectValue).FieldByName(fieldName)
  73. return &fieldValue, nil
  74. }