| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package domain
- import (
- "git.sxidc.com/go-framework/baize/infrastructure/logger"
- "git.sxidc.com/go-tools/utils/reflectutils"
- "git.sxidc.com/service-supports/fserr"
- "reflect"
- )
- type Object interface{}
- func HasField(object Object, fieldName string) bool {
- return hasField(object, fieldName)
- }
- func SetField[T any](object Object, fieldName string, value T) {
- fieldValue, err := getFieldValue(object, fieldName)
- if err != nil {
- logger.GetInstance().Error(err)
- return
- }
- if !fieldValue.IsValid() || !fieldValue.CanSet() {
- err := fserr.New("object字段" + fieldName + "无法赋值")
- logger.GetInstance().Error(err)
- return
- }
- fieldValue.Set(reflect.ValueOf(value))
- }
- func Field[T any](object Object, fieldName string) (T, error) {
- var zero T
- fieldValue, err := getFieldValue(object, fieldName)
- if err != nil {
- return zero, err
- }
- if !fieldValue.IsValid() {
- err := fserr.New("object字段" + fieldName + "无法赋值")
- return zero, err
- }
- retValue, ok := fieldValue.Interface().(T)
- if !ok {
- return zero, err
- }
- return retValue, nil
- }
- func ToConcrete[T Object](object Object) T {
- concrete, ok := object.(T)
- if !ok {
- logger.GetInstance().Error(fserr.New("领域对象转化失败"))
- var zero T
- return zero
- }
- return concrete
- }
- func hasField(object Object, fieldName string) bool {
- if object == nil {
- return false
- }
- objectValue := reflect.ValueOf(object)
- if reflectutils.IsValueStructOrStructPointer(objectValue) {
- return false
- }
- fieldValue := reflectutils.PointerValueElem(objectValue).FieldByName(fieldName)
- if !fieldValue.IsValid() {
- return false
- }
- return true
- }
- func getFieldValue(object Object, fieldName string) (*reflect.Value, error) {
- if object == nil {
- return nil, fserr.New("object为nil")
- }
- objectValue := reflect.ValueOf(object)
- if reflectutils.IsValueStructOrStructPointer(objectValue) {
- return nil, fserr.New("object必须是结构或结构指针")
- }
- fieldValue := reflectutils.PointerValueElem(objectValue).FieldByName(fieldName)
- return &fieldValue, nil
- }
|