![](/img/trans.png)
[英]Automapper: how to map many members using a property of source type?
[英]How can I tell Automapper to try to call the .Value property on source members, not .ToString() on UglySoapXml objects?
考慮此類:
public class UglyXmlSoapObject {
public FIRST_NAMETYPESHAPE FIRST_NAMETYPESHAPE { get; set; }
public LAST_NAMETYPESHAPE LAST_NAMETYPESHAPE { get; set; }
public DEPT_TAX_CALCTYPESHAPE DEPT_TAX_CALCTYPESHAPE { get; set; }
}
public class FIRST_NAMETYPESHAPE {
public String Value { get; set; }
}
public class LAST_NAMETYPESHAPE {
public String Value { get; set; }
}
public class DEPT_TAX_CALCTYPESHAPE {
public Decimal Value { get; set; }
}
XXXX_XXXXXXTYPESHAPE只是包裝程序/持有人類,它們暴露String屬性(值)。 因此,要實際獲得firstName,請致電:
字符串firstName = uglyXmlObject.FIRST_NAMETYPESHAPE.Value;
如何告訴Automapper始終嘗試映射給定對象的.Value屬性? 我有幾十個Xml類,我想映射如下:
UglyXmlSource.FIRST_NAMETYPESHAPE.Value => poco.FirstName UglyXmlSource.LAST_NAMETYPESHAPE.Value => poco.LastName
我發現我需要自定義命名約定,但是,要獲取源成員Value,Automapper只會調用ToString(),因此poco.FirstName的值最終為:“ AutoMapperDemo.Program + FIRST_NAMETYPESHAPE”
也許IValueResolver可以解決問題? 我試圖使用ResolveUsing指定一個ValueResolver / IMemberValueResolver,但是執行該操作並不明顯。
我希望ValueResolver可以在任何通用對象上工作; UglyXmlSoapObject的成員只是通用對象,但成員始終具有Value屬性。
public class SoapXmlNaming : INamingConvention
{
static CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
static TextInfo textInfo = cultureInfo.TextInfo;
public string SeparatorCharacter
{
get { return "_"; }
}
public Regex SplittingExpression { get; } = new Regex(@"[\p{Ll}\p{Lu}0-9]+(?=_?)");
public string ReplaceValue(Match match) =>
textInfo.ToTitleCase(match.Value);
}
public class Poco
{
public String FirstName { get; set; }
public String LastName { get; set; }
public Decimal DeptTaxCalc { get; set; }
}
我想出了答案。 解決方案是通過注冊使用ConvertUsing方法注冊的自定義格式器(ITypeConvert的實現)來使用自定義格式器提取值:
public void Map(){
var config = new MapperConfiguration(cfg =>
cfg.CreateMap<Object, Object>().ConvertUsing<XmlPropertyConvert>();
cfg.CreateMap<UglyXmlSoapObject, Poco>();
}
public class XmlPropertyConverter : ITypeConverter<Object,Object>{
public object Convert(object source, object destination, ResolutionContext context) {
return GetValueObject(source)
}
private Object GetValueObject(Object member){
var type = member.GetType();
if (type.Name.ToLower().EndsWith("typeshape")){
var property = type.GetProperties().SingleOrDefault(x => x.Name == "Value");
if (property != null){
var value = property.GetValue(member);
return value;
}
}
return member;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.