| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- package binding
- import (
- "git.sxidc.com/go-framework/baize/infrastructure/logger"
- "git.sxidc.com/service-supports/fserr"
- "reflect"
- )
- type DTO interface{}
- 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, error) {
- concrete, ok := object.(T)
- if !ok {
- var zero T
- return zero, fserr.New("DTO转化失败")
- }
- return concrete, nil
- }
- func getDTOFieldValue(dto DTO, fieldName string) (*reflect.Value, error) {
- dtoType := reflect.TypeOf(dto)
- if dtoType.Kind() != reflect.Ptr {
- return nil, fserr.New("dto必须是结构指针类型")
- }
- if dtoType.Kind() == reflect.Ptr && dtoType.Elem().Kind() != reflect.Struct {
- return nil, fserr.New("dto必须是结构指针类型")
- }
- dtoValue := reflect.ValueOf(dto)
- if !dtoValue.IsValid() {
- return nil, fserr.New("dto为nil")
- }
- fieldValue := dtoValue.Elem().FieldByName(fieldName)
- return &fieldValue, nil
- }
|