Деструктурировать словарь сложных объектов

Согласно документации Serilog, можно регистрировать словарь и будет деструктурировать его, включая глубокую деструктуризацию объектов.

Если это так, кто-нибудь знает, почему следующий код не работает должным образом:

public class ActionLoggingAttribute : ActionFilterAttribute
{
    private ILogger _logger;

    public ActionLoggingAttribute(ILogger<ActionLoggingAttribute> logger)
    {
        _logger = logger;
    }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (context.ActionArguments.Count > 0)
        {
            _logger.LogInformation("Request parameters: {@parameters}", new Dictionary<string, object>(context.ActionArguments));
        }
    }
}

приводит к следующему результату:

{... "MessageTemplate":"Request parameters: {@parameters}","Properties":{"parameters":"[newCard(key), Namespace.ClassNameInsteadOfTheActualObject(value)]" ...}}

Вопросы :

  1. Это похоже на массив, а не на словарь. Почему? Также он содержит кавычки.
  2. Почему объект также не деструктурируется?

person DotnetProg    schedule 18.04.2017    source источник
comment
большинство библиотек C# JSON сериализуют словарь в объект со свойствами, где свойство равно ключу внутри словаря. Он меньше и менее подробен, чем [{ "key": "someKeyname", "value": 1234}, { ... }]   -  person Tseng    schedule 18.04.2017
comment
Если это так, я ожидаю, что он будет сериализован как {"key1": "value1", "key2": "value2"}. В моем случае newCard является ключом, а объект, который не сериализуется должным образом, является значением. Как сейчас, он просто выглядит так, как будто он был сериализован как массив.   -  person DotnetProg    schedule 18.04.2017
comment
Это подозрительно похоже на ошибку в адаптере Serilog.Extensions.Logging (который соединяет ведение журнала ASP.NET Core с поставщиком Serilog). Написанный код должен работать так, как вы ожидаете.   -  person Nicholas Blumhardt    schedule 20.04.2017
comment
Спасибо, Николай, успокоил :)   -  person DotnetProg    schedule 20.04.2017


Ответы (1)


EDIT: Автор Serilog только что ответил, что это может быть ошибка.

Во всяком случае, в конце концов я перебрал словарь вручную.

Вот код, если кому интересно:

var paramsMessageToBeLogged = "Request parameters : ";
var paramsList = new List<object>();

foreach (var param in context.ActionArguments)
{
    paramsMessageToBeLogged = paramsMessageToBeLogged + string.Format("{{@{0}}} ", param.Key);
    paramsList.Add(param.Value);
}

_logger.LogInformation(paramsMessageToBeLogged, paramsList.ToArray());

Если у кого-то есть лучшее предложение, это будет здорово. Между тем - это работает.

person DotnetProg    schedule 19.04.2017