Sì, sicuramente.
Se vuoi manipolare un oggetto, in realtà utilizzo una funzione come questa:
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;
}
Questa linea:
MethodBase method = new StackFrame(2).GetMethod();
Cammina nel frame dello stack per trovare il metodo di chiamata, quindi utilizziamo la riflessione per ottenere i valori delle informazioni sui parametri passati ad esso per una funzione di segnalazione errori generica. Per ottenere il metodo corrente è sufficiente utilizzare l'attuale stack frame (1).
Come altri hanno già detto per l'attuale nome dei metodi, puoi anche usare:
MethodBase.GetCurrentMethod()
Preferisco camminare nello stack perché, se guardi internamente a quel metodo, crea semplicemente StackCrawlMark comunque. Rivolgermi direttamente allo Stack mi sembra più chiaro
Post 4.5 ora puoi usare [CallerMemberNameAttribute] come parte dei parametri del metodo per ottenere una stringa del nome del metodo - questo può aiutare in alcuni scenari (ma in realtà nell'esempio sopra)
public void Foo ([CallerMemberName] string methodName = null)
Questa sembrava essere principalmente una soluzione per il supporto di INotifyPropertyChanged in cui in precedenza avevi le stringhe disseminate per tutto il codice dell'evento.