2010-09-24 12 views
1

Existe-t-il un moyen pour un attribut qui a été appliqué à une méthode de connaître la méthode à laquelle elle a été appliquée lors de l'exécution?Un attribut peut-il découvrir à quelle méthode il est appliqué lors de l'exécution?

[AttributeUsage(AttributeTargets.Method)] 
public class CustomAttribute : Attribute {} 

public class Foo 
{ 
    [Custom] 
    public void Method() {} 
} 

Je l'attribut requête au moment de l'exécution

var attribute = typeof(Foo) 
    .GetMethod("Method") 
    .GetCustomAttributes(false) 
    .OfType<CustomAttribute>() 
    .First(); 

peut « attribut » dire qu'il a été appliqué à la méthode « méthode » de la classe « Foo »?

+0

Je prévois d'utiliser l'attribut pour définir un nom convivial pour la méthode et revenir au nom complet s'il n'est pas fourni. Ceci est utilisé dans le cadre d'un schéma d'autorisation où le nom sera recherché dans une base de données. – Jason

Répondre

0

Pas de manière intégrée. Si un attribut contient une logique de méthode qui nécessite une connaissance de ce qu'il décore, la méthode doit prendre un paramètre MemberInfo (ou un type plus dérivé comme MethodInfo, PropertyInfo, FieldInfo, etc.) ou un objet si l'instance doit être transmise directement. Ensuite, en invoquant la logique sur l'attribut, on peut lui donner l'instance, ou la classe de métadonnées appropriée, à partir de laquelle il a été obtenu par le code de contrôle en premier lieu.

+0

J'ai créé une deuxième propriété sur l'attribut que j'ai défini comme étant le nom de la méthode. Ensuite, à l'intérieur de l'attribut, je fais une certaine logique pour utiliser la valeur de propriété correcte. Soit celui défini par l'utilisateur, soit celui défini par le code. J'espérais ne pas avoir à mettre la propriété supplémentaire. – Jason

5

Je ne crois pas, mais si cela pouvait, ce ne serait pas utile.

Je vais vous expliquer.

Les attributs ne sont créés qu'une fois que vous les avez interrogés. Si vous ouvrez une DLL, aucun des attributs que vous avez ajoutés ne sera créé. Vous devrez d'abord obtenir un pointeur vers l'objet auquel les attributs s'appliquent, puis, une fois que vous aurez demandé ses attributs, le framework .net les créera pour vous. Donc, au moment où ils sont instanciés et votre code arrive à les évaluer, vous savez déjà à quoi ils s'appliquent. Pour cette raison, je crois qu'il est recommandé de ne pas mettre trop de magie dans les attributs eux-mêmes.

+0

Dans ce cas, j'utilise l'attribut pour créer un nom convivial. Je voudrais qu'il soit par défaut à son nom complet si un n'a pas été fourni. (comme le nom de la méthode est le nom convivial). – Jason