Json десериализовать дженерики - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь десериализовать объекты, используя дженерики, но потребители не могут их забрать, даже если они выглядят совершенно нормально.

    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);
    }

Моему сообщению не удается найти потребителя, но есть переменная команды? Даже если эти объекты выглядят одинаково?

1 Ответ

1 голос
/ 08 апреля 2020

Приведенное ниже сообщение variable будет иметь тип времени компиляции object и время выполнения тип TMessage. Для работы привязки обобщенного типа необходимо, чтобы тип мог быть оценен во время компиляции.

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

Вам потребуется либо десериализовать для более точного c generi c типа:

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

, либо проверить тип во время выполнения, например:

if(message is TestCommand)

... 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...