Беглые утверждения PropertyInfo BeDecoratedWith

Библиотека .NET FluentAssertions (версия 2.1.0) имеет несколько BeDecoratedWith<T>() реализаций для подтверждения того, что тип (или тип член) имеет заданный атрибут, примененный к нему. Эти вызовы выглядят так:

typeof(X).Should()
    .BeDecoratedWith<SomeAttribute>(attr => attr.Name == expectedValue);

Лямбда-выражение утверждает, что атрибут имеет Name, равный некоторому expectedValue.

Это замечательно, когда sut является типом, но когда это член, нет перегрузки BeDecoratedWith<T>, которая принимает лямбда-выражение.

// compiler error: Cannot convert lambda expression to type 'string' because it is not a delegate type
typeof(X).GetProperty("xyz").Should()
    .BeDecoratedWith<SomeAttribute>(attr => attr.Name == expectedValue);

Документация быстро охватывает расширяемость, но мне трудно понять, как d создать перегрузку (или метод расширения) BeDecoratedWith<T> в PropertyInfoAssertions, который принимает лямбду, подобную приведенной выше.

Может ли кто-нибудь показать мне, как правильно расширить Fluent Assertions для достижения этой цели?


person nikmd23    schedule 08.09.2013    source источник
comment
Итак, с чем конкретно у вас проблемы?   -  person BartoszKP    schedule 09.09.2013
comment
Лучший способ расширить библиотеку. Казалось бы, я могу расширить ProprtyInfoAssertions, но тогда мне пришлось бы самому переписывать весь код обработки атрибутов, что кажется неправильным.   -  person nikmd23    schedule 09.09.2013
comment
Хорошо, теперь я понимаю проблему.   -  person BartoszKP    schedule 09.09.2013


Ответы (2)


У вас есть два варианта:

  1. Создайте метод расширения для PropertyInfoAssertions, который поддерживает лямбда-выражение и использует свойство SubjectProperties для доступа к фактическому свойству.
  2. Разветвите репозиторий на GitHub и добавьте его непосредственно во фреймворк. Я приму запросы на вытягивание.
person Dennis Doomen    schedule 09.09.2013
comment
Хорошо, похоже, мне нужно разветвить код, чтобы сделать это правильно. Спасибо за указатель. - person nikmd23; 10.09.2013
comment
Нет, не надо. Вы по-прежнему можете использовать вариант 1. Вариант 2 вам нужен только в том случае, если вы хотите, чтобы я включил его в 2.2. - person Dennis Doomen; 10.09.2013

Один из возможных ответов — подождать некоторое время, а затем получить последнюю версию, так как эта проблема, похоже, была недавно исправлена ​​:)

http://fluentassertions.codeplex.com/workitem/12455

person BartoszKP    schedule 08.09.2013
comment
Это не решение моей проблемы. Я использую этот код, но хочу, чтобы он делал больше. - person nikmd23; 09.09.2013