Visual Studio Intellisense не показывает методы при общей перегрузке - PullRequest
3 голосов
/ 19 ноября 2009

Учитывая следующие два интерфейса (это небольшие примеры, а не моя фактическая реализация):

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.

Ответы [ 4 ]

1 голос
/ 19 ноября 2009

Я полагаю, это потому, что Intellisense видит элемент с тем же именем, что и Generic Type, а затем не пытается искать свойства intellisense, пока вы не зададите ему тип. Например, если вы наведете указатель мыши на «Require.That(string)», Visual Studios сообщит о нем как IAssertion вместо IStringAssertion.

В любом случае, вы можете просто переименовать «That» для вашего IStringAssertion в «ThatString». То есть

public static class Require
{

    public static IStringAssertion ThatString(string value)
    {
        return null;
    }

    public static IAssertion<T> That<T>(T value)
    {
        return null;
    }

}

public class RAR
{
    public void TestMethod(StringComparer a, string b)
    {
        Require.That<StringComparer>(a).IsNotNull();
        Require.ThatString(b).IsNotNullOrEmpty();
    }
}

Возможно, не идеал, но я не верю, что в коде есть что-то еще, кроме использования разных имен методов.

0 голосов
/ 19 ноября 2009

Вы должны установить Resharper тогда. Это намного лучше, чем VS 2008 intellisense.

0 голосов
/ 19 ноября 2009

Та же проблема здесь - Intellisense не так уж велик.

Я начал использовать Visual Assist X и переключился на Visual Assist X.

edit: (увидел твой ответ на предложение резарпера) Я думаю, что у резарпера есть бесплатная версия. В любом случае, VAX действительно стоит того, чтобы вы купили его для себя.

0 голосов
/ 19 ноября 2009

Я полагаю, что вы только что столкнулись лицом к лицу с реальностью, что иногда Intellisense просто не такой умный и время от времени просто глупый.

...