在每个方法执行之前,我想记录该方法的所有参数。为此,我将使用AOP(面向方面编程)并创建“Loggable”属性。但是......我也想知道我的参数内容。对于字符串参数,这不是问题。但我想知道每个场合都有一个很好的解决方案,比如对象,整体,双打,......
有没有其他方法可以解决此问题,然后覆盖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:
- 数据:Id = 1
Name =“我的测试数据名称”
值= 1234.56
- 数:5
- 留言:“请记录我”
答案 0 :(得分:2)
一个简单的选择是使用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"
我自己的偏好是每个方法都采用单个parameter object - 日志代码更整洁,更通用的参数对象,所有单个参数名称都可以从参数对象中推断出来: / p>
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"
}