2009-11-19 2 views
3

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

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); 
} 

Thi s компилируется и будет выполняться. Я даже могу настроить тесты, которые проходят, например:

Assert.IsInstanceOf<IStringAssertion>(Require.That(string.Empty)); 
Assert.IsNotInstanceOf<IStringAssertion>(Require.That(new object()); 

Проблема Я бегу в и весь смысл этого вопроса, является то, что Visual Studio 2005 IntelliSense не решает различия между ними.

Когда я типа 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. Спасибо, Luke. Это оставляет только Visual Studio 2005.

+1

Пытается нажать Ctrl + пробел после знака точки? –

+0

Да и ничего. Я где-то читал, что резольвер, который использует VS для заполнения списка методов для Intellisense, несколько ленив. Я просто надеялся, что в моем коде есть что-то, что поможет создать правильный список. – Jason

+1

Хммм, intellisense, похоже, подбирает все, как ожидалось для меня, используя VS2008SP1. – LukeH

ответ

1

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

В любом случае, вы можете просто переименовать «Это» для вашего 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

Вот чего я боялся. Различные имена методов являются опцией, но в руководстве по разработке дизайна указано, что вы должны хранить имена типов из имен методов. Считаете ли вы, что разные имена методов могут добавить к сложности api с точки зрения пользователя? Имейте в виду, что это предназначено для других разработчиков в моей корпоративной среде. – Jason

+0

Ну, не смей слово как Евангелие. Там может быть способ, но я не вижу этого. Сложность ссылок, я думаю, это полностью зависит от того, сколько из них вы собираетесь создавать. Если это всего лишь 1 или 2 для строки и int, т. Е. ThatString и ThatInt, то я не вижу серьезной проблемы. Если вы собираетесь использовать множество типов, то вы можете также отказаться от общего и сделать все это вручную. Я всегда придерживался ваших правил кодирования, где это возможно. – GenericTypeTea

+0

Похоже, что это будет лучший вариант. Я собираюсь добавить ToString, ThatDate, ThatComparable ... методы на заводе. Не идеально, но он будет работать. – Jason

0

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

+0

Согласен, но этот код предназначен не только для меня. Это часть некоторого кода инфраструктуры, который разрабатывается для других разработчиков в моей команде, и без Intellisense говорит им, какие методы они могут использовать, они будут потеряны. Я не хочу, чтобы им приходилось искать это в документации каждый раз, когда они используют эти классы. – Jason

0

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

+0

Спасибо за ответ, но это действительно не вариант, поскольку компания не будет платить за него. – Jason

0

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

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

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

+0

У Resharper есть бесплатная версия для академического или с открытым исходным кодом, ни одна из которых я не претендую. У меня есть Resharper дома и люблю его, но это для использования в корпоративной среде разработчиками, которые не имеют и не получат Resharper. – Jason

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

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