Sim definitivamente.
Se você deseja manipular um objeto, eu realmente uso uma função como esta:
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;
}
Está linha:
MethodBase method = new StackFrame(2).GetMethod();
Percorre o quadro da pilha para encontrar o método de chamada e usamos a reflexão para obter os valores das informações dos parâmetros passados a ele para uma função genérica de relatório de erros. Para obter o método atual, basta usar o quadro de pilha atual (1).
Como já foi dito para o nome dos métodos atuais, você também pode usar:
MethodBase.GetCurrentMethod()
Eu prefiro andar na pilha porque se olhar internamente para esse método, ele simplesmente cria um StackCrawlMark de qualquer maneira. Dirigir-se à pilha diretamente parece mais claro para mim
Na publicação 4.5, agora você pode usar o [CallerMemberNameAttribute] como parte dos parâmetros do método para obter uma sequência do nome do método - isso pode ajudar em alguns cenários (mas na verdade, digamos o exemplo acima)
public void Foo ([CallerMemberName] string methodName = null)
Isso parecia ser principalmente uma solução para o suporte do INotifyPropertyChanged, onde anteriormente você tinha strings espalhadas por todo o código do evento.