当然是。
如果你想要一个对象来操作我实际上使用这样的函数:
public static T CreateWrapper<T>(Exception innerException, params object[] parameterValues) where T : Exception, new()
{
if (parameterValues == null)
{
parameterValues = new object[0];
}
Exception exception = null;
StringBuilder builder = new StringBuilder();
MethodBase method = new StackFrame(2).GetMethod();
ParameterInfo[] parameters = method.GetParameters();
builder.AppendFormat(CultureInfo.InvariantCulture, ExceptionFormat, new object[] { method.DeclaringType.Name, method.Name });
if ((parameters.Length > 0) || (parameterValues.Length > 0))
{
builder.Append(GetParameterList(parameters, parameterValues));
}
exception = (Exception)Activator.CreateInstance(typeof(T), new object[] { builder.ToString(), innerException });
return (T)exception;
}
这一行:
MethodBase method = new StackFrame(2).GetMethod();
遍历堆栈帧以找到调用方法,然后我们使用反射来获取传递给它的参数信息值,以用于通用错误报告函数。要获取当前方法,只需使用当前堆栈帧 (1)。
正如其他人对当前方法名称所说的那样,您也可以使用:
MethodBase.GetCurrentMethod()
我更喜欢遍历堆栈,因为如果在内部查看该方法,它无论如何都会创建一个 StackCrawlMark。直接寻址堆栈对我来说似乎更清楚
在 4.5 之后,您现在可以使用 [CallerMemberNameAttribute] 作为方法参数的一部分来获取方法名称的字符串 - 这在某些情况下可能会有所帮助(但实际上在上面的示例中)
public void Foo ([CallerMemberName] string methodName = null)
这似乎主要是 INotifyPropertyChanged 支持的解决方案,以前您的事件代码中到处都是字符串。