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,我希望某种方法可以将方法的名称作为参数传递,而无需手动编辑代码。
这可能吗?
答案 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);
}
在实现这一目标方面:
Microsoft.Bcl
NuGet package 答案 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。