有没有办法让编译器使用封闭的方法名称初始化字符串?

时间:2013-10-31 11:14:20

标签: c# methods compiler-construction static

我们的C#代码库有几种方法可以创建包含方法名称的错误消息。我可以让编译器为我静态插入方法名称吗?我知道我可以用反思做点什么,但我宁愿不做。

除此之外,我看到了很多复制粘贴错误,其中一个方法的异常处理被复制到另一个方法,而方法名称没有改变。

    public void Method1()
    {
        try
        {
            DoStuff();
        }
        catch (Exception e)
        {
            HandleError("Method1", details);
        }
    }

有没有一种方法可以告诉编译器在那里插入当前的方法名称,而不是将字符串"Method1"(和"Method2"包含到"Methodn")?

4 个答案:

答案 0 :(得分:2)

在NET 4.5中,您可以使用CallerMemberName属性。您的HandleError方法将如此:

void HandleError(YourDetailsClass details,
                [CallerMemberName] callingMethod = null)

你只需使用

HandleError(details);

答案 1 :(得分:1)

您可以使用返回MethodBase.GetCurrentMethod

MethodInfo
using System.Reflection;

然后

catch (Exception e)
{
    HandleError(MethodBase.GetCurrentMethod().Name, details);
}

答案 2 :(得分:0)

一种方法是使用StackTrace中的StackFrameSystem.Diagnostics类来检索方法名称:

private void HandleError(Exception ex) {
    var st = new StackTrace ();
    var sf = st.GetFrame (1); // get the previous method that called this
                              // (not this method)

    var previousMethod = sf.GetMethod ();

    var errorMessage = string.Format("Error in method {0} with Exception {1}", 
                           previousMethod.Name,
                           ex.Message);
}

示例:

void MyMethod() {
    HandleError(new Exception("Error here"));
}

errorMessage将包含:Error in method MyMethod with Exception Error here

答案 3 :(得分:0)

是的,你可以试试这个:

System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
string methodName = st.GetFrame(0).GetMethod().Name;

您将获得正在运行的方法的名称。