c# - Json反序列化泛型
问题描述
我正在尝试使用泛型反序列化对象,但即使它们看起来完全没问题,消费者也无法拾取它们。
private readonly IContainer _container = Ioc.GetContainer();
public async Task Test()
{
var command = new TestCommand();
var serializeObject = JsonConvert.SerializeObject(command);
var message = JsonConvert.DeserializeObject(serializeObject, command.GetType());
await Process(message);
await Process(command);
}
private async Task Process<TMessage>(TMessage message)
{
await _container.Resolve<IMessageDispatcher>().Dispatch(message);
}
public async Task Dispatch<TMessage>(TMessage message)
{
using (var scope = _lifetimeScope.BeginLifetimeScope())
{
var consumers = scope.Resolve<IEnumerable<IMessageConsumer<TMessage>>>().ToList();
if(consumers.Any() == false) throw new Exception($"No consumer for message {message.GetType().Name}");
foreach (var consumer in consumers)
{
await consumer.Consume(message, CancellationToken.None);
}
}
}
public interface IMessageConsumer<TMessage>
{
Task Consume(TMessage message, CancellationToken cancellationToken);
}
我的消息找不到消费者,但命令变量找到了?即使这些对象看起来相同?
解决方案
下面的variable
消息将是编译时类型object
和运行时类型TMessage
。为了使泛型类型绑定起作用,该类型需要能够在编译时进行评估。
var message = JsonConvert.DeserializeObject(serializeObject, command.GetType());
您将需要反序列化为更具体的泛型类型:
var message = JsonConvert.DeserializeObject<TestCommand>(serializeObject);
或以某种方式在运行时检查类型,例如:
if(message is TestCommand)
...
推荐阅读
- autodesk-forge - 将 Autodesk VRED 场景转换为 SVF 模型
- python - 从 Python 中删除现有 pod 的简单方法
- javascript - NextJS 中无法通过 FCM 接收通知
- angular - Angular Apollo grapqhql 缓存更新
- cordova - APK文件未在任何地方的alpha中生成cordova cli builder
- html - css无需创建每个边框颜色设置上/下/左/右填充颜色
- spring-boot - 参数值 [multiVLANSupport] 与预期类型不匹配 [java.util.List (n/a)]
- javascript - 将 CORS 标头添加到我的 NodeJS ExpressJS API 但不起作用
- php - Php Elastic Search 按地理距离排序
- javascript - Kendo Grid 在每一行上创建一个图标按钮