C#中的通用集中式参数记录器方法

时间:2011-12-29 08:29:11

标签: c# logging parameters

请考虑以下JavaScript代码段:

Object.prototype.log = function() {
   // here, you have a centralized place to do logging stuff;
   console.log(this);
}

function fullName(firstName, lastName)
{
    // here, using a simple one-line code, you can log all parameters;
    arguments.log();
}

fullName('saeed', 'nemati');

我们是否可以使用类似的机制来记录传递给方法的所有参数,在C#中?

注意:我所做的是使用反射,但没有成功:

public static void LogParameters(this ParameterInfo[] parameters)
{
    StringBuilder builder = new StringBuilder();
    builder.Append("*****************\r\n");
    builder.Append("Parameters\r\n");
    parameters.ToList().ForEach(pi =>
    {
        builder.AppendFormat("{0} => {1}\r\n", pi.Name, pi.DefaultValue);
        // The problem is that, I can't get the value of the parameter here
    });
    builder.Append("*****************");
    Log.Write(builder.ToString());
}

public string GetFullName(string firstName, string lastName)
{
    MethodBase.GetCurrentMethod().GetParameters().LogParameters();
    return firstName + " - " + lastName;
}

GetFullName("saeed", "neamati");

2 个答案:

答案 0 :(得分:7)

不,您无法使用反射获取参数值。您必须明确地将它们传递给日志记录方法。

您可以使用调试器API执行此操作,但您可能不希望这样做。如果我是你,我会明确地做 - 事实上,这可能会导致更有用的日志记录,因为你只能记录重要内容,并在消息中提供一些上下文。

答案 1 :(得分:2)

您可以使用PostSharp和AOP进行操作。这是一个示例,它还记录了方法调用的参数。

http://blogs.lessthandot.com/index.php/WebDev/ServerProgramming/using-postsharp-and-log4net-to-set-up-co