package domain import ( "git.sxidc.com/go-framework/baize/logger" "git.sxidc.com/service-supports/fserr" "reflect" ) type Object interface{} func SetField[T any](object Object, fieldName string, value T) { fieldValue, err := getObjectFieldValue(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 { var zero T fieldValue, err := getObjectFieldValue(object, fieldName) if err != nil { logger.GetInstance().Error(err) return zero } if !fieldValue.IsValid() { err := fserr.New("object字段" + fieldName + "无法赋值") logger.GetInstance().Error(err) return zero } retValue, ok := fieldValue.Interface().(T) if !ok { err := fserr.New("object字段" + fieldName + "无法转换类型") logger.GetInstance().Error(err) return zero } return retValue } func ToConcreteObject[T Object](object Object) (T, error) { concrete, ok := object.(T) if !ok { var zero T return zero, fserr.New("领域对象转化失败") } return concrete, nil } func getObjectFieldValue(object Object, fieldName string) (*reflect.Value, error) { dtoType := reflect.TypeOf(object) if dtoType.Kind() != reflect.Ptr { return nil, fserr.New("object必须是结构指针类型") } if dtoType.Kind() == reflect.Ptr && dtoType.Elem().Kind() != reflect.Struct { return nil, fserr.New("object必须是结构指针类型") } dtoValue := reflect.ValueOf(object) if !dtoValue.IsValid() { return nil, fserr.New("object为nil") } fieldValue := dtoValue.Elem().FieldByName(fieldName) return &fieldValue, nil }