带有自定义参数的AOP日志
本文关键字:AOP 日志 参数 自定义 | 更新日期: 2023-09-27 18:14:19
在每个方法执行之前,我想记录该方法的所有参数。为此,我将使用AOP(面向方面编程)并创建一个"Loggable"属性。但是…我还想知道我的参数的内容。对于字符串参数,这不是问题。但我想知道一个好的解决方案,每一个场合,如对象,int, double,…
是否有其他方法来解决这个问题,而不是覆盖ToString()方法?(在示例中,我总是遇到字符串参数…)
:
public class MyType {
public int Id { get; set; }
public string Name { get; set; }
public double Value { get; set; }
}
[Loggable]
public void IDoWhateverIWant(MyType data, int count, string message){
//Whatever I want
}
IDoWhateverIWant(
new MyType(){
Id = 1,
Name = "My test data name",
Value = 1234.56}
, 5
, "Log me, please");
Logmessage(这些参数的呈现方式对我来说是一样的,我只是想看看它们):
22/07/2014 9:30传入消息:IDoWhateverIWant,参数:
- data: Id = 1
Name = "我的测试数据名称"
- count: 5
-留言:"Log me, please"
一个简单的选择是使用NewtonSoft。Json来序列化每个参数。这个简单的例子:
public void IDoWhateverIWant(MyType data, int count, string message)
{
string logMessage =
ParameterValueMessage(data, "data") + Environment.NewLine +
ParameterValueMessage(count, "count") + Environment.NewLine +
ParameterValueMessage(message, "message");
Debug.Print(logMessage);
}
public static string ParameterValueMessage<T>(T arg, string name)
{
string result = JsonConvert.SerializeObject(arg, Formatting.Indented);
return name + ": " + result;
}
生成以下内容:
data: {
"Id": 1,
"Name": "My test data name",
"Value": 1234.56
}
count: 5
message: "Log me, please"
我个人的偏好是每个方法都接受一个参数对象——使用参数对象的日志代码更简洁,更通用,所有的单个参数名称都可以从参数对象中推断出来:
public class MyParameterObject
{
public MyType data { get; set; }
public int count { get; set; }
public string message { get; set; }
}
,其序列化方式与
基本相同,并且不必传递每个单独参数的名称:
public void IAlsoDoWhateverIWant(MyParameterObject parameterObject)
{
string logMessage = ParameterValueMessage(parameterObject);
Debug.Print(logMessage);
}
public static string ParameterValueMessage<T>(T arg)
{
return JsonConvert.SerializeObject(arg, Formatting.Indented);
}
并产生以下输出:
{
"data": {
"Id": 1,
"Name": "My test data name",
"Value": 1234.56
},
"count": 5,
"message": "Log me, please"
}