2016-04-07 41 views
6

devo un'interfaccia con metodi annotati con l'attributo Pure da System.Diagnostics.Contracts:Controllare se Generico Interfaccia Utente è "puro" (ha attributo Pure)

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

    [Pure] 
    T Last { get; } 

    [Pure] 
    T Choose(); 

    void Add(T item); 

    T Remove(); 
} 

desidero scorrere i membri dell'interfaccia e controllo se il membro è puro o no. Attualmente non sono in grado di ottenere gli attributi del Info Utente:

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

Che cosa mi manca?

Si noti che non ho una classe o un'istanza di questo. Solo l'interfaccia.

+0

Controllare questo - http://stackoverflow.com/questions/540749/can-a-c-sharp-class-inherit-attributes-from-its-interface Si consiglia di riconsiderare avere gli attributi sulla vostra interfaccia. – Wjdavis5

+0

Ma non è questa la domanda sulle classi che ereditano gli attributi? Io ** solo ** voglio guardare l'interfaccia e i suoi ** membri **. –

+0

@ Wjdavis5 E in realtà non ho alcuna implementazione da considerare, solo le interfacce. –

risposta

3

Utilizzare un decompilatore di propria scelta e aprire l'assemblea. Vedrai che il PureAttribute verrà rimosso dal compilatore. Quindi non puoi ottenerlo con la riflessione perché non esiste più.

Per testare è possibile utilizzare un altro attributo che non verrà rimosso e sarà possibile ottenerlo utilizzando il riflesso.

Aggiornamento: Da un lato, come lei ha detto nei commenti:

Pure è un attributo condizionale ([condizionale ("CONTRACTS_FULL")]), e viene aggiunto solo se i contratti sono abilitati.

D'altra parte il codice ha un difetto perché il metodo Linqs First() restituirà un membro, senza un attributo, il metodo getter della proprietà. È possibile utilizzare il codice come questo per ottenere il risultato previsto: members.Where(x => x.GetCustomAttributes<PureAttribute>().Any()).ToArray().

+0

Ok, capisco. In realtà è andato. Allora dimmi: come fanno i Contratti di Codice a sapere se un metodo è puro o no? –

+0

Per essere onesti, non lo so, forse c'è un altro compilatore leggermente modificato in uso. – thehennyy

+0

Oh, aspetta. Pure è un attributo condizionale ('[Conditional (" CONTRACTS_FULL ")]'), e viene aggiunto solo se i contratti sono abilitati. L'attributo è effettivamente visibile nell'assembly (usando dotPeeks) se CC è abilitato, tuttavia non si mostrano ancora con il riflesso. –