2015-10-12 5 views
0

Je connais l'attribut CallerMemberName, qui remplace le paramètre null par, par exemple, le nom de la propriété à partir de laquelle vous appelez la méthode.Y a-t-il un attribut CallingMemberName?

Ceci est très utile pour des choses comme PropertyChanged-Notifications. Actuellement, nous avons un scénario différent, où nous aimerions avoir un paramètre-attribut qui remplace le paramètre nul avec le nom de la méthode que vous appelez.

D'une manière générale, est-il possible de faire quelque chose comme ça? Pour être honnête, je n'ai pas encore beaucoup traité avec l'attribut personnalisé, mais dans notre cas, il serait intéressant d'avoir quelque chose comme ça. Y at-il des informations utiles que je peux commencer?

Répondre

1

Il n'y a pas attribut, mais vous pouvez utiliser C# 6 nameof opérateur:

public void SomeMethod() 
{ 
    Console.WriteLine(nameof(SomeMethod)); 
} 

Bien sûr, cela ne veut pas dynamiquement et insère automatiquement le nom de la méthode que vous êtes, mais vous oblige à avoir un référence réelle à la méthode. Cependant, il prend en charge IntelliSense complet et sera également mis à jour automatiquement lorsque vous refactorisez le nom de la méthode. Et le nom est inséré au moment de la compilation, donc vous n'obtenez aucune baisse de performance.

Si vous souhaitez placer ce code dans un endroit plus central, comme vous le faites par ex. Implémentations INPC dans les modèles de vue de base, votre idée est un peu imparfaite de toute façon. Si vous aviez une méthode commune vous appeler pour trouver le nom de la méthode que vous êtes, il serait alors toujours signaler le nom de méthode de la méthode commune:

public void SomeMethod() 
{ 
    Console.WriteLine(GetMethodName()); 
} 

// assuming that a CallingMemberNameAttribute existed 
public string GetMethodName([CallingMemberName] string callingMember = null) 
{ 
    return callingMember; // would be always "GetMethodName" 
} 

Mais au lieu, vous pouvez utiliser à nouveau ici la CallerMemberNameAttribute, qui obtiendra alors correctement le nom de la méthode appelant la fonction GetMethodName:

public void SomeMethod() 
{ 
    Console.WriteLine(GetMethodName()); 
} 

public string GetMethodName([CallerMemberNamed] string callerMember = null) 
{ 
    return callerMember; 
} 
+0

Merci c'est une bonne idée à la fin :) – Jannik