2009-11-19 8 views
3

Compte tenu des deux interfaces suivantes (ce sont de petits exemples, pas ma mise en œuvre effective):IntelliSense Visual Studio ne pas montrer les méthodes de surcharge générique

public interface IAssertion<T> { 
    IAssertion<T> IsNotNull(); 
    IAssertion<T> Evaluate(Predicate<T> predicate) 
} 

public interface IStringAssertion : IAssertion<string> { 
    IStringAssertion IsNotNullOrEmpty(); 
} 

et une usine statique qui renverra l'interface appropriée, par exemple:

public static class Require { 
    public static IAssertion<T> That<T>(T value) { 
      ... 
    } 

    public static IStringAssertion That(string value) { 
      ... 
    } 
} 

Je devrais pouvoir faire ce qui suit:

public void TestMethod(SomeClass a, string b) { 
    Require.That(a).IsNotNull(); 
    Require.That(b).IsNotNullOrEmpty().Evaluate(SomeMethodThatAcceptsString); 
} 

Thi Le code s compile et s'exécutera réellement. Je peux même mettre en place des tests qui passent, tels que:

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

Le problème que je courais dans et toute la question de cette question, est que Visual Studio 2005 IntelliSense ne résout pas les différences entre les deux.

Quand je tape Require.That("..."). j'attendre à voir une liste des

 
Evaluate(Predicate predicate) 
IsNull() 
IsNotNullOrEmpty() 

mais je ne vois rien. Je voudrais vraiment garder le même nom de méthode pour les surcharges. Je veux conserver la surcharge générique à cause du prédicat dans la méthode Evaluate de l'interface IAssertion.

En outre, je sais que je peux faire quelque chose de proche à cela en utilisant des méthodes d'extension, mais ce n'est pas une option parce que je veux toujours supporter .Net 2.0 et je voudrais garder l'API.

Mise à jour:

Il y a eu quelques bonnes réponses qui impliquent des tiers add-ons à Visual Studio. Malheureusement, je ne suis pas en mesure d'installer ou d'acheter des outils complémentaires pour Visual Studio en raison de la bureaucratie que je suis en train de développer. (Je déteste la politique!)

Je cherche un code unique option qui fonctionnera dans Visual Studio 2005 et Visual Studio 2008.

Mise à jour:

Cela fonctionne dans Visual Studio 2008. Merci, Luke. Cela ne laisse que Visual Studio 2005.

+1

Vous essayez de taper ctrl + barre d'espace après le signe de point? –

+0

Oui et rien. J'ai lu quelque part que le résolveur que VS utilise pour remplir la liste des méthodes pour Intellisense est un peu paresseux. J'espérais juste qu'il y avait quelque chose que je pouvais faire dans mon code pour l'aider à construire la bonne liste. – Jason

+1

Hmmm, IntelliSense semble ramasser tout comme prévu pour moi, en utilisant VS2008SP1. – LukeH

Répondre

1

Je crois que c'est parce que Intellisense voit l'élément avec le même nom qu'un type générique et ne cherche pas les propriétés intellisense avant de lui donner un type. Par exemple, si vous passez la souris sur le "Require.That(string)" Visual Studios le signalera comme IAssertion, au lieu d'un IStringAssertion. De toute façon, vous pouvez juste renommer le "That" pour votre IStringAssertion à "ThatString". C'est à dire.

Probablement pas idéal
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(); 
    } 
} 

, mais je ne crois pas qu'il y ait aucune façon autour d'elle sur le front de code à part en utilisant différents noms de méthode.

+0

Voilà ce dont j'avais peur. Les noms de méthodes différentes sont une option, mais les directives de conception de framework indiquent que vous devez garder les noms de types hors des noms de méthodes. Pensez-vous que des noms de méthodes différents ajouteraient à la complexité de l'API du point de vue de l'utilisateur? Gardez à l'esprit que ceci est destiné aux autres développeurs dans mon environnement d'entreprise. – Jason

+0

Eh bien, ne prenez pas ma parole comme évangile. Il y a peut-être un moyen de contourner le problème, mais je ne le vois pas. Ref complexité, je pense que cela dépend entièrement de combien de ceux-ci vous avez l'intention de créer. Si c'est juste 1 ou 2 pour string et int, c'est-à-dire ThatString et ThatInt, alors je ne vois pas de problème majeur. Si vous allez utiliser beaucoup de types, alors vous pouvez aussi faire disparaître le générique et les faire tous manuellement. Je garderais toujours vos directives de codage si possible. – GenericTypeTea

+0

Cela semble être la meilleure option. Je vais ajouter ThatString, ThatDate, ThatComparable ... méthodes à l'usine. Pas idéal, mais ça va marcher. – Jason

0

Je crois que vous venez de faire face à la réalité que parfois Intellisense est tout simplement pas si intelligent, et est, de temps en temps, juste stupide.

+0

D'accord, mais ce code n'est pas juste pour moi. Cela fait partie d'un code cadre qui est en train de se développer pour les autres développeurs de mon équipe et sans Intellisense qui leur dira quelles méthodes ils peuvent utiliser, ils seront perdus. Je ne veux pas qu'ils aient à chercher dans la documentation chaque fois qu'ils utilisent ces classes. – Jason

0

Vous devez ensuite installer Resharper. C'est beaucoup mieux que VS 2008 intellisense.

+0

Merci pour la réponse, mais ce n'est vraiment pas une option puisque l'entreprise ne paiera pas pour cela. – Jason

0

Même problème ici - Intellisense n'est pas génial.

j'ai commencé à l'aide de Visual Assist X, et sont passés à Visual Assist X.

modifier: (vu votre réponse à la suggestion de ReSharper) Je pense que ReSharper a une version gratuite. En tout cas, VAX vaut vraiment le coup pour vous de l'acheter pour vous-même.

+0

Resharper a une version gratuite pour utilisation académique ou open source, dont je ne suis pas éligible. J'ai Resharper à la maison, et j'adore, mais c'est pour une utilisation dans un environnement d'entreprise par des développeurs qui n'ont pas et ne recevront pas Resharper. – Jason