Учитывая следующие два интерфейса (это небольшие примеры, а не моя фактическая реализация):
public interface IAssertion<T> {
IAssertion<T> IsNotNull();
IAssertion<T> Evaluate(Predicate<T> predicate)
}
public interface IStringAssertion : IAssertion<string> {
IStringAssertion IsNotNullOrEmpty();
}
и статическая фабрика, которая возвратит соответствующий интерфейс, например:
public static class Require {
public static IAssertion<T> That<T>(T value) {
...
}
public static IStringAssertion That(string value) {
...
}
}
Я должен быть в состоянии сделать следующее:
public void TestMethod(SomeClass a, string b) {
Require.That(a).IsNotNull();
Require.That(b).IsNotNullOrEmpty().Evaluate(SomeMethodThatAcceptsString);
}
Этот код компилируется и фактически запускается. Я даже могу настроить проходящие тесты, такие как:
Assert.IsInstanceOf<IStringAssertion>(Require.That(string.Empty));
Assert.IsNotInstanceOf<IStringAssertion>(Require.That(new object());
Проблема, с которой я сталкиваюсь, и весь смысл этого вопроса заключается в том, что intellisense в Visual Studio 2005 не устраняет различия между ними.
Когда я набираю Require.That("...").
, я должен ожидать увидеть список
Evaluate(Predicate predicate)
IsNull()
IsNotNullOrEmpty()
но вместо этого я ничего не вижу.
Мне бы очень хотелось сохранить то же имя метода для перегрузок. Я хочу сохранить общую перегрузку из-за предиката в методе Evaluate интерфейса IAssertion.
Кроме того, я знаю, что могу сделать что-то близкое к этому, используя методы расширения, но это не вариант, потому что я все еще хочу поддерживать .Net 2.0 и хотел бы сохранить свободный API.
Обновлен:
Было несколько хороших ответов, касающихся сторонних надстроек для Visual Studio. К сожалению, я не могу установить или приобрести дополнительные инструменты для Visual Studio из-за корпоративной волокиты, под которой я разрабатываю. (Я ненавижу политику!)
Я ищу параметр только для кода, который будет работать как в Visual Studio 2005, так и в Visual Studio 2008.
Обновлен:
Это работает в Visual Studio 2008. Спасибо, Люк . Это только оставляет Visual Studio 2005.