package binding import ( "git.sxidc.com/go-framework/baize/domain" "git.sxidc.com/go-framework/baize/infrastructure/logger" "git.sxidc.com/go-framework/baize/tag/assign" "git.sxidc.com/go-tools/utils/reflectutils" "git.sxidc.com/service-supports/fserr" "reflect" ) type DTO interface{} func AssignDTOToDomainObject(dto DTO, domainObject domain.Object) error { return assign.DefaultUsage(dto, domainObject) } func Field[T any](dto DTO, fieldName string) T { var zero T fieldValue, err := getDTOFieldValue(dto, fieldName) if err != nil { logger.GetInstance().Error(err) return zero } if !fieldValue.IsValid() { err := fserr.New("dto字段" + fieldName + "无法赋值") logger.GetInstance().Error(err) return zero } retValue, ok := fieldValue.Interface().(T) if !ok { err := fserr.New("dto字段" + fieldName + "无法转换类型") logger.GetInstance().Error(err) return zero } return retValue } func ToConcreteDTO[T DTO](object DTO) T { concrete, ok := object.(T) if !ok { logger.GetInstance().Error(fserr.New("DTO转化失败")) var zero T return zero } return concrete } func getDTOFieldValue(dto DTO, fieldName string) (*reflect.Value, error) { if dto == nil { return nil, fserr.New("dto为nil") } dtoValue := reflect.ValueOf(dto) if reflectutils.IsValueStructOrStructPointer(dtoValue) { return nil, fserr.New("dto必须是结构或结构指针") } fieldValue := reflectutils.PointerValueElem(dtoValue).FieldByName(fieldName) return &fieldValue, nil }