2016-04-07 4 views
6

У меня есть интерфейс с методами аннотированных с атрибутом Pure от System.Diagnostics.Contracts:Проверьте Generic Interface Пользователь имеет «Pure» (имеет Pure Attribute)

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

    [Pure] 
    T Last { get; } 

    [Pure] 
    T Choose(); 

    void Add(T item); 

    T Remove(); 
} 

Я желаю, чтобы перебрать членов интерфейса и проверки если член чист или нет. В настоящее время я не в состоянии получить любые атрибуты из информации члена:

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

Что я упускаю?

Обратите внимание, что у меня нет класса или экземпляра. Только интерфейс.

+0

Проверьте это - http://stackoverflow.com/questions/540749/can-a-c-sharp-class-inherit-attributes-from-its-interface Возможно, вам захочется пересмотреть атрибуты на вашем интерфейсе. – Wjdavis5

+0

Но не вопрос о классах, наследующих атрибуты? Я ** ** ** хочу посмотреть интерфейс и его ** членов **. –

+0

@ Wjdavis5 И на самом деле у меня нет реализаций, а только интерфейсов. –

ответ

3

Используйте декомпилятор по вашему выбору и откройте сборку. Вы увидите, что PureAttribute будет удален компилятором. Таким образом, вы не можете получить его с отражением, потому что его больше не существует.

Чтобы проверить, вы можете использовать другой атрибут, который не будет удален, и вы сможете получить его с помощью отражения.

Update: С одной стороны, как вы уже упоминали в комментариях:

Pure является условным атрибутом ([Conditional ("CONTRACTS_FULL")]), и добавляется только если контракты разрешены.

С другой стороны, у вашего кода есть недостаток, потому что метод Linqs First() возвращает элемент без атрибута, метод getter свойства. Вы можете использовать такой код, чтобы получить ожидаемый результат: members.Where(x => x.GetCustomAttributes<PureAttribute>().Any()).ToArray().

+0

Хорошо, вижу. Это действительно исчезло. Тогда скажите мне: как Code Contracts знают, является ли метод чистым или нет? –

+0

Если честно, я не знаю, возможно, есть другой или немного модифицированный компилятор. – thehennyy

+0

Ой, подождите. Pure является условным атрибутом ('[Conditional (" CONTRACTS_FULL ")]') и добавляется только в случае включения контрактов. Атрибут фактически отображается в сборке (используя dotPeeks), если CC включен, однако они все еще не отображаются с отражением. –

 Смежные вопросы

  • Нет связанных вопросов^_^