Tak, zdecydowanie.
Jeśli chcesz manipulować obiektem, używam funkcji takiej jak ta:
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;
}
Ta linia:
MethodBase method = new StackFrame(2).GetMethod();
Podchodzi do ramki stosu, aby znaleźć metodę wywołującą, a następnie używamy refleksji, aby uzyskać wartości informacji o parametrach przekazane do niej dla ogólnej funkcji raportowania błędów. Aby uzyskać bieżącą metodę, po prostu użyj zamiast tego bieżącej ramki stosu (1).
Jak powiedzieli inni dla obecnej nazwy metod, możesz także użyć:
MethodBase.GetCurrentMethod()
Wolę chodzić po stosie, ponieważ jeśli spojrzysz wewnętrznie na tę metodę, po prostu tworzy StackCrawlMark. Bezpośrednie adresowanie stosu wydaje mi się wyraźniejsze
Po wersji 4.5 możesz teraz użyć [CallerMemberNameAttribute] jako części parametrów metody, aby uzyskać ciąg nazwy metody - może to pomóc w niektórych scenariuszach (ale tak naprawdę w powyższym przykładzie)
public void Foo ([CallerMemberName] string methodName = null)
Wydawało się, że jest to głównie rozwiązanie dla obsługi INotifyPropertyChanged, gdzie wcześniej ciągi znaków były zaśmiecone przez cały kod zdarzenia.