簡體   English   中英

如何告訴Automapper嘗試在源成員上調用.Value屬性,而不是在UglySoapXml對象上調用.ToString()?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM