1: [Test]
2: public void SomeTest() {
3: FooBar foo = new FooBar() { SimpleString };
4: PropertyDescriptor property = TypeDescriptor.GetProperties(foo)["SimpleString"];
5: // code continues ...
6: }
Кодировать имена свойств в строковые константы - как-то не айс. Вдохновленный использованием expressions в moq, asp.net mvc и других фреймворках, я добавил вспомогательный метод FooBar.GetProperty:
1: class FooBar {
2: public static PropertyDescriptor GetProperty<T>(Expression<Func<T>> propertyExpression) {
3: MemberExpression body = (MemberExpression)propertyExpression.Body;
4: PropertyDescriptor property = TypeDescriptor.GetProperties(body.Member.DeclaringType)[body.Member.Name];
5: Debug.Assert(property != null);
6: return property;
7: }
8: }
Теперь в коде тестов можно избавиться от строковых констант с именами свойств, заменив их на выражения. Новый код показан ниже:
1: [Test]
2: public void SomeTest() {
3: FooBar foo = new FooBar() { SimpleString };
4: PropertyDescriptor property = FooBar.GetProperty(() => foo.SimpleString);
5: // code continues ...
6: }
В плюс: подсказки Intellisense при наборе, более тесная интеграция с инструментами рефакторинга (так, Find All References теперь выдает не пустой результат для свойств FooBar).