首页 > 解决方案 > 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);
    }

我的消息找不到消费者,但命令变量找到了?即使这些对象看起来相同?

标签: c#json.net

解决方案


下面的variable消息将是编译时类型object运行时类型TMessage。为了使泛型类型绑定起作用,该类型需要能够在编译时进行评估。

var message = JsonConvert.DeserializeObject(serializeObject, command.GetType());

您将需要反序列化为更具体的泛型类型:

var message = JsonConvert.DeserializeObject<TestCommand>(serializeObject);

或以某种方式在运行时检查类型,例如:

if(message is TestCommand)

... 

推荐阅读