2016-04-07 16 views
6

ben System.Diagnostics.Contracts den Pure özniteliği ile açıklamalı yöntemlerle bir arayüze sahip (Saf Özellik vardır) üye safsa veya değilse. Ben eksikKontrol

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

: Şu anda üye bilgilerinden herhangi özelliklerini elde edebilmek değilim?

Burada bir sınıf veya örneğim olmadığını unutmayın. Sadece arayüz.

+0

Bunu kontrol edin - http://stackoverflow.com/questions/540749/can-a-c-sharp-class-inherit-attributes-from-its-interface Arabiriminizde öznitelikleri yeniden gözden geçirmeyi düşünebilirsiniz. – Wjdavis5

+0

Ancak, öznitelikleri miras alan sınıflar hakkında bu soru değil mi? Ben ** sadece ** ara yüzüne ve ** üyelerine ** bakmak istiyorum. –

+0

@ Wjdavis5 Ve ben gerçekten sadece arayüzler bakmak için herhangi bir uygulama yok. –

cevap

3

Seçtiğiniz bir decompiler kullanın ve derlemenizi açın. PureAttribute'un derleyici tarafından kaldırılacağını göreceksiniz. Yani bunu yansıma ile elde edemezsiniz çünkü artık yoktur.

Test etmek için, kaldırılmayacak başka bir öznitelik kullanabilirsiniz ve yansıma kullanarak elde edebileceksiniz.

Güncelleme:

Saf ([Koşullu ("CONTRACTS_FULL")]) koşullu niteliktir ve sadece sözleşmeler ise eklenir: Eğer yorumların da belirttiğimiz gibi Bir yandan , etkin. Linqs First() yöntem, bir özelliğin olmadan mülkiyet alıcı yöntemini üyesi dönecektir çünkü Öte yandan

kodunuzu bir kusur vardır. Beklenen sonucu almak için bu kodu kullanabilirsiniz: members.Where(x => x.GetCustomAttributes<PureAttribute>().Any()).ToArray().

+0

Tamam, anlıyorum. Aslında gitti. Öyleyse söyle bana: Bir yöntem saf olup olmadığını Kod Sözleşmeleri nasıl biliyor? –

+0

Dürüst olmak gerekirse, bilmiyorum, belki kullanımda başka veya biraz değiştirilmiş bir derleyici var. – thehennyy

+0

Oh, bekle. Saf koşullu bir özniteliktir ('[Koşullu (" CONTRACTS_FULL ")]') ve yalnızca sözleşmeler etkinse eklenir. Bu özellik, CC etkinse, montajda (dotPeeks kullanarak) görülebilir - ancak yine de yansıma ile gösterilmezler. –