Определенно да.
Если вы хотите, чтобы объект манипулировал, я на самом деле использую такую функцию:
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, где ранее у вас были строки, засоренные на протяжении всего кода события.