我们的C#代码库有几种方法可以创建包含方法名称的错误消息。我可以让编译器为我静态插入方法名称吗?我知道我可以用反思做点什么,但我宁愿不做。
除此之外,我看到了很多复制粘贴错误,其中一个方法的异常处理被复制到另一个方法,而方法名称没有改变。
public void Method1()
{
try
{
DoStuff();
}
catch (Exception e)
{
HandleError("Method1", details);
}
}
有没有一种方法可以告诉编译器在那里插入当前的方法名称,而不是将字符串"Method1"
(和"Method2"
包含到"Methodn"
)?
答案 0 :(得分:2)
在NET 4.5中,您可以使用CallerMemberName属性。您的HandleError
方法将如此:
void HandleError(YourDetailsClass details,
[CallerMemberName] callingMethod = null)
你只需使用
HandleError(details);
答案 1 :(得分:1)
您可以使用返回MethodBase.GetCurrentMethod
的MethodInfousing System.Reflection;
然后
catch (Exception e)
{
HandleError(MethodBase.GetCurrentMethod().Name, details);
}
答案 2 :(得分:0)
一种方法是使用StackTrace
中的StackFrame
和System.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;
您将获得正在运行的方法的名称。