Oui, définitivement.
Si vous souhaitez un objet à manipuler j'utilise une fonction comme ceci:
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();
Promenades en place la trame de pile à trouver la méthode d'appel puis nous avons utiliser la réflexion pour obtenir des informations sur le paramètre des valeurs transmises pour le générique de la fonction de rapport d'erreurs. Pour obtenir la méthode actuelle tout simplement utiliser de pile actuel cadre (1) à la place.
Comme d'autres l'ont dit pour les méthodes actuelles de nom, vous pouvez également utiliser:
MethodBase.GetCurrentMethod()
Je préfère la marche de la pile car si regarder intérieurement à cette méthode, il crée simplement un StackCrawlMark de toute façon. L'adressage de la Pile directement semble plus clair pour moi
Post 4.5 vous pouvez maintenant utiliser la [CallerMemberNameAttribute] dans le cadre de la méthode des paramètres pour obtenir une chaîne de caractères du nom de la méthode, qui peut aider dans certains scénarios (mais vraiment dans l'exemple ci-dessus)
public void Foo ([CallerMemberName] string methodName = null)
Il semble que ce soit surtout une solution pour INotifyPropertyChanged soutien là où auparavant vous aviez des chaînes éparpillées à travers votre code d'événement.