使用Automapper映射/合并两个对象,但忽略默认值



我已经研究了很多关于SO的帖子,有很多人有类似的问题,但到目前为止都没有效果。

我有一个对象的两个实例。一个正在另一个类中使用,而另一个则通过websocket定期(大约每5秒左右(更新新信息。

订阅时来自websocket的第一个响应是为其所有属性分配了值的对象。问题是,来自websocket的后续数据只会带来已经更改的数据,所以当我进行反序列化时,它会设置那些没有分配值的属性,即它们的默认值。

我宁愿不做一个";。ForMember";因为这个对象有52个属性。

var configuration = new MapperConfiguration(cfg =>
{
cfg.CreateMap<StreamingQuoteResponse.Content, StreamingQuoteResponse.Content>().ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null));
});

var mapper = new Mapper(configuration);
var newQuote = mapper.Map<StreamingQuoteResponse.Content>(quote);

据我所知,在上面的代码中,默认情况下只有字符串为null。Floats将为0;双打、0.0d等

该对象具有所有不同类型的属性(bool、double、float、char、string(。如果源属性是默认值,是否有方法忽略单个属性的映射?我想有一种方法可以使用AutoMapper的(Pre(Condition获取属性类型,如果它是例如typeof(float(,那么如果源值为0,我们可以忽略映射?不过我不确定你能不能做到。

或者可能是一个子程序/方法,可以使用反射来解决所有这些问题?

这可能会在未来对某人有所帮助,但我最终放弃了AutoMapper,转而使用JSON.NET。我不知道他们有这个"JsonMergeSettings"。我还必须为正在(反(序列化的类的所有属性添加一个属性。例如:

public class Content
{
[JsonProperty("key", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Key { get; set; }
}

然后,在接收所有websocket数据的事件处理程序中,我做了以下操作:

private bool firstFlag = true;
private JObject jObject;
private void HandleStreamingWebsocketData(object sender, MessageEventArgs e)
{
if (firstFlag)
{
jObject = JObject.Parse(e.Data);
firstFlag = false;
}
jObject.Merge(JObject.Parse(e.Data), new JsonMergeSettings
{
MergeArrayHandling = MergeArrayHandling.Merge
});
}

希望这能帮助那些尝试做同样事情的人。我相信这可以用AutoMapper完成,但我认为这要容易得多,而且很可能会快一点,因为在JSON被反序列化为C#对象之前,你要合并JSON,而不是反序列化更新的数据并将其与反序列化的以前的数据进行比较,然后以这种方式映射它们。