Ja definitiv.
Wenn Sie möchten, dass ein Objekt manipuliert wird, verwende ich tatsächlich eine Funktion wie die folgende:
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;
}
Diese Linie:
MethodBase method = new StackFrame(2).GetMethod();
Geht den Stapelrahmen hoch, um die aufrufende Methode zu finden, und verwendet dann Reflection, um Parameterinformationswerte zu erhalten, die für eine generische Fehlerberichterstattungsfunktion an ihn übergeben wurden. Um die aktuelle Methode zu erhalten, verwenden Sie stattdessen einfach den aktuellen Stapelrahmen (1).
Wie andere für den aktuellen Methodennamen gesagt haben, können Sie auch Folgendes verwenden:
MethodBase.GetCurrentMethod()
Ich gehe lieber über den Stapel, weil bei interner Betrachtung dieser Methode ohnehin einfach ein StackCrawlMark erstellt wird. Die direkte Adressierung des Stapels erscheint mir klarer
Nach 4.5 können Sie jetzt das [CallerMemberNameAttribute] als Teil der Methodenparameter verwenden, um eine Zeichenfolge des Methodennamens abzurufen. Dies kann in einigen Szenarien hilfreich sein (im obigen Beispiel jedoch wirklich).
public void Foo ([CallerMemberName] string methodName = null)
Dies schien hauptsächlich eine Lösung für die INotifyPropertyChanged-Unterstützung zu sein, bei der zuvor Zeichenfolgen im gesamten Ereigniscode verstreut waren.