客户端自动代码生成后缺少类型映射配置或不支持的映射
Missing type map configuration or unsupported mapping after auto code generation on the client
我有一个简单的class:
[DataContract]
public class ClaimView
{
[DataMember]
public string Type { get; set; }
[DataMember]
public string Value { get; set; }
[DataMember]
public string ValueType { get; set; }
}
我通过 wcf 服务器引用在客户端收到此 class,并尝试将其映射到 System.Security.Claims.Claim,就像这样:
Mapper.CreateMap<ClaimView, Claim>()
.ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.Type))
.ForMember(dest => dest.Value, opt => opt.MapFrom(src=> src.Value))
.ForMember(dest => dest.ValueType, opt => opt.MapFrom(src => src.ValueType))
.ForMember(dest => dest.Issuer, opt => opt.Ignore())
.ForMember(dest => dest.OriginalIssuer, opt => opt.Ignore())
.ForMember(dest => dest.Properties, opt => opt.Ignore())
.ForMember(dest => dest.Subject, opt => opt.Ignore());
在我收到来自 autommaper 的错误后,他无法转换它。缺少什么或错了什么?
因为Claim doesn't have a default constructor,你需要告诉Automapper使用哪个构造函数,例如:
Mapper.CreateMap<ClaimView, Claim>()
.ConstructUsing(cv => new Claim(cv.Type, cv.Value, cv.ValueType))
.ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.Type))
.ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.Value))
.ForMember(dest => dest.ValueType, opt => opt.MapFrom(src => src.ValueType))
.ForMember(dest => dest.Issuer, opt => opt.Ignore())
.ForMember(dest => dest.OriginalIssuer, opt => opt.Ignore())
.ForMember(dest => dest.Properties, opt => opt.Ignore())
.ForMember(dest => dest.Subject, opt => opt.Ignore());
那么这个测试就会通过:
public void Test()
{
ClaimIdentityView civ = new ClaimIdentityView
{
ClaimViewList = new List<ClaimView>
{
new ClaimView
{
Type = "type",
Value = "val",
ValueType = "string"
}
}
};
var claims = civ.ClaimViewList.Select(Mapper.Map<ClaimView, Claim>).ToList();
Assert.AreEqual(1, claims.Count);
Assert.AreEqual("type", claims.Single().Type);
Assert.AreEqual("val", claims.Single().Value);
Assert.AreEqual("string", claims.Single().ValueType);
}
我有一个简单的class:
[DataContract]
public class ClaimView
{
[DataMember]
public string Type { get; set; }
[DataMember]
public string Value { get; set; }
[DataMember]
public string ValueType { get; set; }
}
我通过 wcf 服务器引用在客户端收到此 class,并尝试将其映射到 System.Security.Claims.Claim,就像这样:
Mapper.CreateMap<ClaimView, Claim>()
.ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.Type))
.ForMember(dest => dest.Value, opt => opt.MapFrom(src=> src.Value))
.ForMember(dest => dest.ValueType, opt => opt.MapFrom(src => src.ValueType))
.ForMember(dest => dest.Issuer, opt => opt.Ignore())
.ForMember(dest => dest.OriginalIssuer, opt => opt.Ignore())
.ForMember(dest => dest.Properties, opt => opt.Ignore())
.ForMember(dest => dest.Subject, opt => opt.Ignore());
在我收到来自 autommaper 的错误后,他无法转换它。缺少什么或错了什么?
因为Claim doesn't have a default constructor,你需要告诉Automapper使用哪个构造函数,例如:
Mapper.CreateMap<ClaimView, Claim>()
.ConstructUsing(cv => new Claim(cv.Type, cv.Value, cv.ValueType))
.ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.Type))
.ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.Value))
.ForMember(dest => dest.ValueType, opt => opt.MapFrom(src => src.ValueType))
.ForMember(dest => dest.Issuer, opt => opt.Ignore())
.ForMember(dest => dest.OriginalIssuer, opt => opt.Ignore())
.ForMember(dest => dest.Properties, opt => opt.Ignore())
.ForMember(dest => dest.Subject, opt => opt.Ignore());
那么这个测试就会通过:
public void Test()
{
ClaimIdentityView civ = new ClaimIdentityView
{
ClaimViewList = new List<ClaimView>
{
new ClaimView
{
Type = "type",
Value = "val",
ValueType = "string"
}
}
};
var claims = civ.ClaimViewList.Select(Mapper.Map<ClaimView, Claim>).ToList();
Assert.AreEqual(1, claims.Count);
Assert.AreEqual("type", claims.Single().Type);
Assert.AreEqual("val", claims.Single().Value);
Assert.AreEqual("string", claims.Single().ValueType);
}