1

我们的 C# 代码库有几个方法可以创建包含方法名称的错误消息。我可以让编译器为我静态插入方法名称吗?我知道我可以通过反思做一些事情,但我宁愿不这样做。

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

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

有没有办法告诉编译器在其中插入当前方法名称,而不是包含字符串"Method1"(以及"Method2"最多)?"Methodn"

4

4 回答 4

2

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

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

你只需使用

HandleError(details);
于 2013-10-31T11:22:01.363 回答
1

您可以使用返回MethodInfo的MethodBase.GetCurrentMethod

using System.Reflection;

接着

catch (Exception e)
{
    HandleError(MethodBase.GetCurrentMethod().Name, details);
}
于 2013-10-31T11:21:21.530 回答
0

一种方法是使用StackTraceStackFrameSystem.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.

于 2013-10-31T11:22:19.217 回答
0

是的,你可以试试这个:

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

您将拥有运行方法的名称。

于 2013-10-31T11:22:55.527 回答