【问题标题】:Json deserialize genericsJson反序列化泛型
【发布时间】:2020-04-08 15:52:00
【问题描述】:

我正在尝试使用泛型反序列化对象,但即使它们看起来完全正常,消费者也无法获取它们。

    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


【解决方案1】:

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

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

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

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

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

if(message is TestCommand)

... 

【讨论】:

  • 这是我的想法,但希望避免收到大约 30 条消息
  • 似乎有办法解决您的问题(为您的命令类型动态创建带有通用类型参数的 MessageDispatcher):stackoverflow.com/a/53250059/1257728 不确定您使用的是什么依赖注入,但我认为可能会重写链接中的示例以适合您的场景
猜你喜欢
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
相关资源
最近更新 更多