我可能有一个奇怪的用例,如果我的问题可以用另一种方式解决,我也会非常感激。
我有一个应用程序,它侦听传入事件(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;
});
在这里,我将传入消息反序列化为我的应用程序数据类型,然后根据此类型调用ProcessEvent
方法,其签名如下所示:
void ProcessEvent<TEvent>(TEvent dto) where TEvent : IEvent;
一切都很好,直到我需要修改我的数据类型,以便现在我必须使用自定义转换器来读取传入的 json。现在,我在 DeserializeObject 中遇到了一个问题,因为 Newtonsoft json 无法理解使用转换器进行反序列化的必要性。在我的消息中,我$type
有一个成员,我可以使用它来选择正确的转换器进行反序列化,但我无法理解如何在转换器或合约解析器中指定它。
我将非常感谢任何帮助。
存在接受JsonConverter
集合的重载Deserialize<>()
。每个JsonConverter
都有一个方法CanConvert
。因此,Deserialize<>()
方法将检查您提供的转换器,并使用第一个CanConvert
您可以创建一个在CanConvert()
和ReadJson()
中返回 true 的单个Converter
,它会检查消息并决定反序列化策略(可能使用您已经创建的类)