abp icon indicating copy to clipboard operation
abp copied to clipboard

dotnet7.0 ObjectMapper.Map violates the constraint of type 'T'

Open XuMengEnEli opened this issue 3 years ago • 2 comments

Is there an existing issue for this?

  • [X] I have searched the existing issues

Description

ObjectMapper.Map 报错

Reproduction Steps

1.创建3个基类 public class UnifyPageResultDto<T> { public PageInfoOutput Pagination { get; set; }

    public List<T> List { get; set; }

    public UnifyPageResultDto()
    {
    }

    public UnifyPageResultDto(List<T> list, int pageIndex, int pageSize, int total)
    {
        List = list;
        Pagination = Pagination ?? new PageInfoOutput();
        Pagination.PageIndex = pageIndex;
        Pagination.PageSize = pageSize;
        Pagination.Total = total;
    }
}

public class IFullAuditedBasicDto { ///

/// 创建人 /// public string CreateUserId { get; set; }

    /// <summary>
    /// 创建时间
    /// </summary>
    public string CreateTime { get; set; }

    /// <summary>
    /// 修改人id
    /// </summary>
    public string UpdateUserId { get; set; }

    /// <summary>
    /// 修改时间
    /// </summary>
    public string UpdateTime { get; set; }
}

public class IFullAuditedBasicDto { ///

/// 创建人 /// public string CreateUserId { get; set; }

    /// <summary>
    /// 创建时间
    /// </summary>
    public string CreateTime { get; set; }

    /// <summary>
    /// 修改人id
    /// </summary>
    public string UpdateUserId { get; set; }

    /// <summary>
    /// 修改时间
    /// </summary>
    public string UpdateTime { get; set; }
}
  1. 创建两个映射类 public class GetAirCompanyCargoOutputVO : IFullAuditedBasicVO { ///

    /// id /// public int Id { get; set; }

     ///<summary>
     /// 航司id
     ///</summary>
     public int AirCompanyId { get; set; }
    
     /// <summary>
     /// 航司代码
     /// </summary>
     public string AirCompanyCode { get; set; }
    
     /// <summary>
     /// 航司英文名
     /// </summary>
     public string AirCompanyEnName { get; set; }
    
     ///<summary>
     /// 起运港,空港id
     ///</summary>
     public int AirportId { get; set; }
    
     /// <summary>
     /// 港口代码
     /// </summary>
     public string AirportCode { get; set; }
    
     /// <summary>
     /// 港口中文名
     /// </summary>
     public string AirportCnName { get; set; }
    
     ///<summary>
     /// 所属货站id
     ///</summary>
     public int CargoId { get; set; }
    
     /// <summary>
     /// 货站中文名
     /// </summary>
     public string CargoCnName { get; set; }
    
     /// <summary>
     /// 货站英文名
     /// </summary>
     public string CargoEnName { get; set; }
    
     ///<summary>
     /// 客/货机,t_enum_value_info表Property=’PlaneType‘;1客机,2货机,3客/货机
     ///</summary>
     public string Type { get; set; }
    
     ///<summary>
     /// 是否直飞
     ///</summary>
     public byte? IsDirect { get; set; }
    

    } public class GetAirCompanyCargoOutput : IFullAuditedBasicDto { ///

    /// id /// public int Id { get; set; }

     ///<summary>
     /// 航司id
     ///</summary>
     public int AirCompanyId { get; set; }
    
     /// <summary>
     /// 航司代码
     /// </summary>
     public string AirCompanyCode { get; set; }
    
     /// <summary>
     /// 航司英文名
     /// </summary>
     public string AirCompanyEnName { get; set; }
    
     ///<summary>
     /// 起运港,空港id
     ///</summary>
     public int AirportId { get; set; }
    
     /// <summary>
     /// 港口代码
     /// </summary>
     public string AirportCode { get; set; }
    
     /// <summary>
     /// 港口中文名
     /// </summary>
     public string AirportCnName { get; set; }
    
     ///<summary>
     /// 所属货站id
     ///</summary>
     public int CargoId { get; set; }
    
     /// <summary>
     /// 货站中文名
     /// </summary>
     public string CargoCnName { get; set; }
    
     /// <summary>
     /// 货站英文名
     /// </summary>
     public string CargoEnName { get; set; }
    
     ///<summary>
     /// 客/货机,t_enum_value_info表Property=’PlaneType‘;1客机,2货机,3客/货机
     ///</summary>
     //public string Type { get; set; }
    
     /// <summary>
     /// 客/货机描述
     /// </summary>
     public string TypeDisp { get; set; }
    
     ///<summary>
     /// 是否直飞
     ///</summary>
     public byte? IsDirect { get; set; }
    

    }

  2. 开始映射 var dataStr = Newtonsoft.Json.JsonConvert.DeserializeObject<UnifyPageResultDto<GetAirCompanyCargoOutputVO>>(""" { "Pagination":{ "PageIndex":1,"PageSize":10,"Total":616},"List":[{ "Id":3721,"AirCompanyId":2125,"AirCompanyCode":"VI","AirCompanyEnName":"Volga-Dnepr Airline Joint Stock","AirportId":569,"AirportCode":"SZX","AirportCnName":"深圳宝安","CargoId":75,"CargoCnName":"国际货站","CargoEnName":"国际货站NB","Type":"3","IsDirect":3,"CreateUserId":0,"CreateTime":"2022-09-23T18:15:00","UpdateUserId":0,"UpdateTime":null},{ "Id":3718,"AirCompanyId":924,"AirCompanyCode":"Y8","AirCompanyEnName":"YANGTZE RIVER EXPRESS","AirportId":112,"AirportCode":"CAN","AirportCnName":"广州白云机场","CargoId":5,"CargoCnName":"货站3","CargoEnName":"one","Type":"3","IsDirect":3,"CreateUserId":0,"CreateTime":"2022-08-29T17:33:00","UpdateUserId":0,"UpdateTime":null},{ "Id":3716,"AirCompanyId":1016,"AirCompanyCode":"GI","AirCompanyEnName":"China Central Longhao Airlines Co., Ltd.","AirportId":112,"AirportCode":"CAN","AirportCnName":"广州白云机场","CargoId":5,"CargoCnName":"货站3","CargoEnName":"one","Type":"3","IsDirect":3,"CreateUserId":0,"CreateTime":"2022-07-05T16:53:00","UpdateUserId":0,"UpdateTime":null},{ "Id":3715,"AirCompanyId":969,"AirCompanyCode":"GG","AirCompanyEnName":"Sky Lease I, Inc.","AirportId":628,"AirportCode":"WUH","AirportCnName":"武汉天河机场","CargoId":67,"CargoCnName":"武汉天河机场国际货站","CargoEnName":"Wuhan Tianhe International Airport","Type":"2","IsDirect":3,"CreateUserId":0,"CreateTime":"2022-06-30T22:41:00","UpdateUserId":0,"UpdateTime":null},{ "Id":3714,"AirCompanyId":954,"AirCompanyCode":"K4","AirCompanyEnName":"KALITTA AIR LLC","AirportId":418,"AirportCode":"NGB","AirportCnName":"宁波栎社机场","CargoId":75,"CargoCnName":"国际货站","CargoEnName":"国际货站NB","Type":"2","IsDirect":1,"CreateUserId":0,"CreateTime":"2022-06-30T22:40:00","UpdateUserId":0,"UpdateTime":null},{ "Id":3712,"AirCompanyId":954,"AirCompanyCode":"K4","AirCompanyEnName":"KALITTA AIR LLC","AirportId":260,"AirportCode":"HFE","AirportCnName":"合肥骆岗机场","CargoId":72,"CargoCnName":"HFE货站","CargoEnName":"HFE ","Type":"2","IsDirect":1,"CreateUserId":0,"CreateTime":"2022-06-30T22:38:00","UpdateUserId":0,"UpdateTime":null},{ "Id":3713,"AirCompanyId":954,"AirCompanyCode":"K4","AirCompanyEnName":"KALITTA AIR LLC","AirportId":123,"AirportCode":"CGO","AirportCnName":"郑州新郑机场","CargoId":56,"CargoCnName":"郑州机场国际西货站","CargoEnName":"Xinzheng Airport International West Cargo Station","Type":"2","IsDirect":1,"CreateUserId":0,"CreateTime":"2022-06-30T22:38:00","UpdateUserId":0,"UpdateTime":null},{ "Id":3711,"AirCompanyId":954,"AirCompanyCode":"K4","AirCompanyEnName":"KALITTA AIR LLC","AirportId":149,"AirportCode":"CSX","AirportCnName":"长沙黄花机场","CargoId":22,"CargoCnName":"长沙黄花机场","CargoEnName":"CSX","Type":"2","IsDirect":1,"CreateUserId":0,"CreateTime":"2022-06-30T22:37:00","UpdateUserId":0,"UpdateTime":null},{ "Id":3710,"AirCompanyId":960,"AirCompanyCode":"GS","AirCompanyEnName":"TIANJING AIRLINE","AirportId":123,"AirportCode":"CGO","AirportCnName":"郑州新郑机场","CargoId":56,"CargoCnName":"郑州机场国际西货站","CargoEnName":"Xinzheng Airport International West Cargo Station","Type":"1","IsDirect":1,"CreateUserId":0,"CreateTime":"2022-06-30T09:17:00","UpdateUserId":0,"UpdateTime":null},{ "Id":3709,"AirCompanyId":315,"AirCompanyCode":"ET","AirCompanyEnName":"Ethiopian Airlines","AirportId":123,"AirportCode":"CGO","AirportCnName":"郑州新郑机场","CargoId":56,"CargoCnName":"郑州机场国际西货站","CargoEnName":"Xinzheng Airport International West Cargo Station","Type":"2","IsDirect":1,"CreateUserId":0,"CreateTime":"2022-06-30T09:16:00","UpdateUserId":0,"UpdateTime":null}]} """);

         var result = ObjectMapper.Map<UnifyPageResultDto<GetAirCompanyCargoOutputVO>, UnifyPageResultDto<GetAirCompanyCargoOutput>>(dataStr);
    

Expected behavior

完成转换

Actual behavior

报错:Autofac.Core.DependencyResolutionException: An exception was thrown while activating Volo.Abp.ObjectMapping.DefaultObjectMapper -> Volo.Abp.AutoMapper.AutoMapperAutoObjectMappingProvider -> λ:Volo.Abp.AutoMapper.IMapperAccessor -> λ:Volo.Abp.AutoMapper.MapperAccessor. ---> System.ArgumentException: GenericArguments[0], 'System.Char', on 'T MaxFloatT' violates the constraint of type 'T'. ---> System.Security.VerificationException: Method System.Linq.Enumerable.MaxFloat: type argument 'System.Char' violates the constraint of type parameter 'T'. at System.RuntimeMethodHandle.GetStubIfNeeded(RuntimeMethodHandleInternal method, RuntimeType declaringType, RuntimeType[] methodInstantiation) at System.Reflection.RuntimeMethodInfo.MakeGenericMethod(Type[] methodInstantiation) --- End of inner exception stack trace --- at System.RuntimeType.ValidateGenericArguments(MemberInfo definition, RuntimeType[] genericArguments, Exception e) at System.Reflection.RuntimeMethodInfo.MakeGenericMethod(Type[] methodInstantiation) at AutoMapper.Internal.TypeDetails.<>c__DisplayClass25_1.<GetPublicNoArgExtensionMethods>b__10(MethodInfo extensionMethod) at System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext() at System.Linq.Enumerable.ConcatIterator1.MoveNext() at System.Linq.Enumerable.SelectManyIterator[TSource,TCollection,TResult](IEnumerable1 source, Func2 collectionSelector, Func3 resultSelector)+MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() at System.Linq.Enumerable.UnionIterator1.GetNext() at System.Linq.Enumerable.UnionIterator1.MoveNext() at System.Linq.Enumerable.ConcatIterator1.MoveNext() at AutoMapper.Internal.TypeDetails.PossibleNames() at AutoMapper.Internal.TypeDetails.GetMember(String name) at AutoMapper.Configuration.Conventions.DefaultName.GetMatchingMemberInfo(TypeDetails sourceTypeDetails, Type destType, Type destMemberType, String nameToSearch) at AutoMapper.Configuration.Conventions.ParentSourceToDestinationNameMapper.GetMatchingMemberInfo(TypeDetails sourceTypeDetails, Type destType, Type destMemberType, String nameToSearch) at AutoMapper.Configuration.Conventions.DefaultMember.MapDestinationPropertyToSource(ProfileMap options, TypeDetails sourceTypeDetails, Type destType, Type destMemberType, String nameToSearch, List1 resolvers, IMemberConfiguration parent, Boolean isReverseMap) at AutoMapper.Configuration.Conventions.MemberConfiguration.MapDestinationPropertyToSource(ProfileMap options, TypeDetails sourceType, Type destType, Type destMemberType, String nameToSearch, List1 resolvers, Boolean isReverseMap) at AutoMapper.Configuration.Conventions.NameSplitMember.MapDestinationPropertyToSource(ProfileMap options, TypeDetails sourceType, Type destType, Type destMemberType, String nameToSearch, List1 resolvers, IMemberConfiguration parent, Boolean isReverseMap) at AutoMapper.Configuration.Conventions.MemberConfiguration.MapDestinationPropertyToSource(ProfileMap options, TypeDetails sourceType, Type destType, Type destMemberType, String nameToSearch, List1 resolvers, Boolean isReverseMap) at AutoMapper.ProfileMap.MapDestinationPropertyToSource(TypeDetails sourceTypeDetails, Type destType, Type destMemberType, String destMemberName, List1 members, Boolean reverseNamingConventions) at AutoMapper.TypeMap..ctor(Type sourceType, Type destinationType, ProfileMap profile, Boolean isReverseMap) at AutoMapper.ProfileMap.BuildTypeMap(IGlobalConfiguration configurationProvider, ITypeMapConfiguration config) at AutoMapper.ProfileMap.Register(IGlobalConfiguration configurationProvider) at AutoMapper.MapperConfiguration.Seal() at AutoMapper.MapperConfiguration..ctor(MapperConfigurationExpression configurationExpression) at AutoMapper.MapperConfiguration..ctor(Action1 configure) at Volo.Abp.AutoMapper.AbpAutoMapperModule.CreateMappings(IServiceProvider serviceProvider) at Autofac.Extensions.DependencyInjection.AutofacRegistration.<>c__DisplayClass3_0.<Register>b__0(IComponentContext context, IEnumerable1 parameters) at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable1 parameters) at Autofac.Core.Activators.Delegate.DelegateActivator.<ConfigurePipeline>b__2_0(ResolveRequestContext ctxt, Action1 next) at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action1 next) at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext ctxt) at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action1 next) at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext ctxt) at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action1 next) --- End of inner exception stack trace --- at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action1 next) at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext ctxt) at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) at Autofac.Core.Resolving.Middleware.RegistrationPipelineInvokeMiddleware.Execute(ResolveRequestContext context, Action1 next) at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext ctxt) at Autofac.Core.Resolving.Middleware.SharingMiddleware.Execute(ResolveRequestContext context, Action1 next) at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext ctxt) at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext ctxt) at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action1 next) at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext ctxt) at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request) at Autofac.Core.Resolving.ResolveOperation.ExecuteOperation(ResolveRequest request) at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request) at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request) at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable1 parameters, Object& instance) at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable1 parameters) at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable1 parameters) at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType) at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) at Volo.Abp.Application.Services.ApplicationService.<get_ObjectMapper>b__24_0(IServiceProvider provider) at Volo.Abp.DependencyInjection.AbpLazyServiceProvider.<>c__DisplayClass8_0.<LazyGetService>b__1() at System.Lazy1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) at System.Lazy1.CreateValue() at Volo.Abp.DependencyInjection.AbpLazyServiceProvider.LazyGetService(Type serviceType, Func2 factory) at Volo.Abp.DependencyInjection.AbpLazyServiceProvider.LazyGetService[T](Func`2 factory) at Volo.Abp.Application.Services.ApplicationService.get_ObjectMapper() at SJZY.MasterData.Application.Services.AirCompanyCargo.AirCompanyCargoService.GetAirCompanyCargoList(GetAirCompanyCargoInputVO input) in D:\Code\SJZY\SJZY.MasterData.Api\src\SJZY.MasterData.Application\Services\AirCompanyCargo\AirCompanyCargoService.cs:line 58 at lambda_method1198(Closure, Object) at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Logged|12_1(ControllerActionInvoker invoker) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() --- End of stack trace from previous location --- at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)

Regression?

其他版本一切正常,只有dotnet7.0 + abp 6.0.1 时才有问题,dotnet6.0 + abp6.0.1也是正常

Known Workarounds

No response

Version

6.0.1

User Interface

Common (Default)

Database Provider

EF Core (Default)

Tiered or separate authentication server

None (Default)

Operation System

Windows (Default)

Other information

No response

XuMengEnEli avatar Dec 11 '22 03:12 XuMengEnEli

hi

Please try to reproduce the problem with minimum code, Thanks

maliming avatar Dec 11 '22 07:12 maliming

Possibly related to these reasons, you can fix this by setting the AutoMapper version of the project to 12.0

https://github.com/AutoMapper/AutoMapper/issues/3988

https://github.com/AutoMapper/AutoMapper/pull/3999

colinin avatar Dec 19 '22 05:12 colinin

We have upgraded to 12. https://github.com/abpframework/abp/pull/13626/commits/cf3d090c4f3ce2785d1e3256b6b02afe53a794aa

maliming avatar Dec 21 '22 01:12 maliming