将方法的名称作为参数传递

时间:2014-01-20 09:41:15

标签: c# methods parameter-passing

private void Method1()
{
    //Do something
    Log("Something","Method1");
}

private void Method2()
{
    //Do something
    Log("Something","Method2");
}

private void Log(string message, string method)
{
    //Write to a log file
    Trace.TraceInformation(message + "happened at " + method);
}

我有几个方法,比如上面的Method1和Method2,我希望某种方法可以将方法的名称作为参数传递,而无需手动编辑代码。

这可能吗?

3 个答案:

答案 0 :(得分:17)

从C#5开始,使用caller info attributes非常容易:

private void Method1()
{
    //Do something
    Log("Something");
}

private void Method2()
{
    //Do something
    Log("Something");
}

private void Log(string message, [CallerMemberName] string method = null)
{
    //Write to a log file
    Trace.TraceInformation(message + "happened at " + method);
}

在实现这一目标方面:

  • 必须使用C#5(或更高版本)编译器,否则它将无法专门处理属性
  • 属性必须存在于目标环境中。那里的选项:
    • 在.NET 4.5中,属性只是存在
    • 对于.NET 4,您可以使用Microsoft.Bcl NuGet package
    • 对于早期版本的.NET,请将attribute declaration复制到您自己的代码中,确保使用相同的命名空间。当您稍后迁移到新版本的.NET时,您需要再次将其删除。

答案 1 :(得分:5)

Jon Skeet的优秀答案。

但是,如果您不使用.NET 4.5,则可以尝试reflection。你怎么知道reflection must be used only when it is absolutely necessary. Do not over-use it for the sake of using it

回来, 你可以做点什么,

 using System.Reflection; //include Reflection namespace

 Console.WriteLine(MethodBase.GetCurrentMethod().Name) //Get the method-name of the current method

在你的情况下,它就像下面一样,

private void Method1()
{
    //Do something
    Log("Something", System.Reflection.MethodBase.GetCurrentMethod().Name);
}

private void Method2()
{
    //Do something
    Log("Something", System.Reflection.MethodBase.GetCurrentMethod().Name);
}

private void Log(string message, string method)
{
    //Write to a log file
    Trace.TraceInformation(message + "happened at " + method);
}

修改

根据以下来自@Jon Skeet的评论,如果你想要.Net 4.5那种花哨而又整洁的实现,请查看Micrsoft.Bcl NUGET包。

答案 2 :(得分:0)

面向方面编程(AOP)通常允许实现此类任务。您可以查看PostSharp的免费版本,尤其是Logging aspect对您的情况有帮助。

您的代码如下所示:

[LogAspect("Something")]
void Method1(string name)
{

}

您可以将PostSharp用于.NET framework 2.0。