Oui définitivement.
Si vous voulez qu'un objet manipule, j'utilise en fait une fonction comme celle-ci:
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;
}
Cette ligne:
MethodBase method = new StackFrame(2).GetMethod();
Parcourt le cadre de pile pour trouver la méthode d'appel, puis nous utilisons la réflexion pour obtenir les valeurs des informations de paramètres qui lui sont transmises pour une fonction de rapport d'erreur générique. Pour obtenir la méthode actuelle, utilisez simplement le cadre de pile actuel (1) à la place.
Comme d'autres l'ont dit pour le nom actuel des méthodes, vous pouvez également utiliser:
MethodBase.GetCurrentMethod()
Je préfère parcourir la pile parce que si vous regardez en interne cette méthode, cela crée tout de même un StackCrawlMark. L'adressage direct de la pile me semble plus clair
Après la 4.5, vous pouvez maintenant utiliser le [CallerMemberNameAttribute] dans le cadre des paramètres de la méthode pour obtenir une chaîne du nom de la méthode - cela peut aider dans certains scénarios (mais vraiment dans l'exemple de l'exemple ci-dessus)
public void Foo ([CallerMemberName] string methodName = null)
Cela semblait être principalement une solution pour le support INotifyPropertyChanged où auparavant vous aviez des chaînes jonchées tout au long de votre code d'événement.