解构复杂对象的字典
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)]" ...}}
问题:
- 它看起来像一个数组,不像字典。为什么?它还包含引号。
- 为什么对象没有被解构?
编辑: 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());
如果有人有更好的建议,那就太好了。同时 - 这有效。
根据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)]" ...}}
问题:
- 它看起来像一个数组,不像字典。为什么?它还包含引号。
- 为什么对象没有被解构?
编辑: 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());
如果有人有更好的建议,那就太好了。同时 - 这有效。