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 }