我可能有一个奇怪的用例,如果我的问题可以用另一种方式解决,也会非常感激。
我有一个应用程序,可以监听传入的事件(json消息)并根据消息类型调用一些代码。它看起来像这样:
_queue.Subscribe(message =>
{
var obj = JsonConvert.DeserializeObject<T>(message, _serializationSettings);
lock (this)
{
var type = obj.GetType();
typeof(IEventStorage)
.GetMethod(nameof(IEventStorage.ProcessEvent))
.MakeGenericMethod(type)
.Invoke(EventsStorage, new[] { obj });
}
return true;
});
这里我将传入的消息反序列化为我的app数据类型,然后根据此类型调用ProcessEvent
方法,该签名如下所示:
void ProcessEvent<TEvent>(TEvent dto) where TEvent : IEvent;
一切都很棒,直到我需要修改我的数据类型,以便现在我必须使用自定义转换器来读取传入的json。现在,我在DeserializeObject中遇到问题,因为Newtonsoft json无法理解使用转换器反序列化的必要性。在我的消息中,我有$type
成员,我可以用它来选择正确的转换器进行反序列化,但我无法理解,如何在转换器或合同解析器中指定它。
我会非常感激你的帮助。
答案 0 :(得分:1)
Deserialize<>()
超载,接受JsonConverter
的集合。每个JsonConverter
都有一个方法CanConvert
。因此,Deserialize<>()
方法将检查您提供的转换器并使用第一个CanConvert
您可以在Converter
和CanConvert()
中创建一个返回true的ReadJson()
,它会检查消息并决定反序列化策略(可能使用您已经创建的类) )