解构复杂对象的字典

Destructure a dictionary of complex objects

根据Serilog's documentation,可以记录字典,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. 为什么对象没有被解构?

编辑: 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());

如果有人有更好的建议,那就太好了。同时 - 这有效。