如何解决C# - 传入 <key, value> 对以创建 JProperty 对象的更好方法
我的 log4net 对象看起来像这样(因为我想将我的集合记录为 json 对象)
_log.Debug(new JObject(new JProperty("Prop1","Val1"),new JProperty("Prop2","Val2")).ToString());
为了更好的代码可读性和轻松添加附加属性,我想做这样的事情
Utility.WriteLog({"Prop1","Val1"},{"Prop2","Val2"});
考虑到需要记录的属性/值对的数量是可变的,我不确定 WriteLog() 方法的外观,除了它应该有一个 params 参数。
我考虑过一个字典(见下文),WriteLog 函数将使用字典中的属性/值键创建一个 JsonObject:
Utility.WriteLog(new Dictionary<string,string>()
{
{"Prop1","Val2" }
});
这是最好的方法,还是有更简洁的替代方法?
解决方法
如果您使用的是 c# 7.0 或更高版本,则可以使用 simplified tuple syntax 传入名称/值 tuples 的 params
数组,以便通过序列化和后续日志记录进行格式化。>
既然你已经标记了你的问题 log4net,你可以像这样在 ILog
上定义扩展方法:
public static partial class LogExtensions
{
public static void DebugProperties(this ILog log,params (string Name,object Value) [] parameters)
// TODO: handle duplicate Name keys in some graceful manner.
=> log.Debug(JsonConvert.SerializeObject(parameters.ToDictionary(p => p.Name,p => p.Value),Formatting.Indented));
public static void InfoProperties(this ILog log,object Value) [] parameters)
=> log.Info(JsonConvert.SerializeObject(parameters.ToDictionary(p => p.Name,Formatting.Indented));
}
然后这样称呼它们:
log.DebugProperties(("Prop1","Val1"),("Prop2","Val2"));
log.InfoProperties(("Prop3",new SomeClass { SomeValue = "hello" }));
并得到输出:
2021-01-21 21:12:36,215 DEBUG: {
"Prop1": "Val1","Prop2": "Val2"
}
2021-01-21 21:12:36,230 INFO : {
"Prop3": {
"SomeValue": "hello"
}
}
如果您使用的是 c# 9.0 或更高版本,您还可以添加一个采用 Dictionary<string,object>
的日志记录方法,并在调用该方法时使用 abbreviated new ()
syntax,它会在已知时省略类型:>
public static partial class LogExtensions
{
public static void DebugDictionary(this ILog log,Dictionary<string,object> parameters)
=> log.Debug(JsonConvert.SerializeObject(parameters,Formatting.Indented));
}
然后:
log.DebugDictionary(new () { {"Prop1","Val1"},{"Prop2","Val2" } } );
当然,如果您愿意,您可以将您的 ILog log
包装在 Utility
类中,并使用其输入类似于上述扩展方法的方法,但如果您使用扩展方法,则没有必要.
演示小提琴here。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。