2016-04-07 1 views
6

J'ai une interface avec des méthodes annotées avec l'Pure attribut de System.Diagnostics.Contracts:Vérifiez si membre Interface générique est « Pure » (a Attribute pur)

public interface IFoo<T> { 
    [Pure] 
    T First { get; } 

    [Pure] 
    T Last { get; } 

    [Pure] 
    T Choose(); 

    void Add(T item); 

    T Remove(); 
} 

Je tiens à itérer sur les membres de l'interface et le contrôle si le membre est pur ou non. Actuellement, je ne suis pas en mesure d'obtenir tous les attributs de l'info membre:

var type = typeof(IFoo<>); 
var memberInfos = type.GetMembers(); 
var memberInfo = memberInfos.First(); // <-- Just select one of them 
var attributes = memberInfo.GetCustomAttributesData(); // <-- Empty 

Qu'est-ce que je manque?

Notez que je n'ai pas de classe ou d'instance ici. Seule l'interface.

+0

Check this out - http://stackoverflow.com/questions/540749/can-a-c-sharp-class-inherit-attributes-from-its-interface Vous voudrez peut-être reconsidérer avoir les attributs sur votre interface. – Wjdavis5

+0

Mais cette question ne concerne-t-elle pas l'héritage des classes par les classes? Je ** seulement ** veux regarder l'interface et ses ** membres **. –

+0

@ Wjdavis5 Et je n'ai pas vraiment d'implémentations à regarder, seulement les interfaces. –

Répondre

3

Utilisez un décompilateur de votre choix et ouvrez votre assemblage. Vous verrez que le PureAttribute sera supprimé par le compilateur. Donc vous ne pouvez pas l'avoir avec la réflexion parce qu'elle n'existe plus.

Pour tester, vous pouvez utiliser un autre attribut qui ne sera pas supprimé et vous pourrez l'obtenir en utilisant la réflexion.

Mise à jour: D'une part, comme vous l'avez mentionné dans les commentaires:

Pure est un attribut conditionnel ([conditionnel ("CONTRACTS_FULL")]), et est ajoutée uniquement si les contrats sont activés.

D'autre part votre code a une faille parce que la méthode Linqs First() renverra un membre sans attribut, la méthode getter de la propriété. Vous pouvez utiliser un code comme celui-ci pour obtenir le résultat attendu: members.Where(x => x.GetCustomAttributes<PureAttribute>().Any()).ToArray().

+0

D'accord, je vois. C'est en fait parti. Alors dites-moi: comment les Contrats de Code savent-ils si une méthode est pure ou non? –

+0

Pour être honnête, je ne sais pas, peut-être qu'il existe un autre compilateur ou un peu modifié en cours d'utilisation. – thehennyy

+0

Oh, attends. Pure est un attribut conditionnel ('[Conditionnel (" CONTRACTS_FULL ")]'), et n'est ajouté que si les contrats sont activés. L'attribut est réellement visible dans l'assemblage (en utilisant dotPeeks) si CC est activé - cependant, ils n'apparaissent toujours pas avec la réflexion. –