2010-05-31 20 views
12

The IHideObjectMembers trick (a.k.a IFluentInterface) peut être utilisé par ex. dans des implémentations d'interface fluides pour masquer System.Object membres d'IntelliSense. (Si vous ne connaissez pas cette astuce, vous pouvez lire sur le sujet via le lien ci-dessus, je ne fais que répéter la déclaration habituelle de l'interface ici :)L'astuce VS IntelliSense - IFluentInterface/IHideObjectMembers ne fonctionne pas. Pourquoi?

using System; 
using System.ComponentModel; 

[EditorBrowsable(EditorBrowsableState.Never)] 
public interface IHideObjectMembers 
{ 
    [EditorBrowsable(EditorBrowsableState.Never)] bool Equals(object obj); 
    [EditorBrowsable(EditorBrowsableState.Never)] int GetHashCode(); 
    [EditorBrowsable(EditorBrowsableState.Never)] Type GetType(); 
    [EditorBrowsable(EditorBrowsableState.Never)] string ToString(); 
} 

Je suis maintenant censé pouvoir se cacher System.Object membres sur un autre type comme suit:

public class SomeClass : IHideObjectMembers { ... } 

ou:

public interface ISomeInterface : IHideObjectMembers { ... } 

J'ai essayé dans les deux VS 2008 express et VS 2008 standard. Cependant, aucun membre n'est caché à IntelliSense. J'ai utilisé le EditorBrowsableAttribute dans différents projets et cela a toujours bien fonctionné; Cependant, cela ne fonctionne pas dans ce scénario particulier.

http://i48.tinypic.com/vhb4fq.jpg

Si les choses avaient travaillé comme prévu, j'aurait seulement vu la méthode SomeMethodTwo.

Ai-je raté quelque chose?


P.S .: Vous pouvez déduire mon code exemple des déclarations et la capture d'écran. J'ai une classe SomeClass avec une seule méthode factice appelée SomeMethodTwo. Très simple. J'ai pas ré-implémenté les quatre méthodes System.Object dans cette classe, comme cela ne devrait pas être nécessaire.

+0

Dans les versions récentes de Visual Studio (2015, 2017) , 'IHideObjectMembers' /' IFluentInterface' est rendu inutilisable par un bug de Roslyn; voir https://github.com/dotnet/roslyn/issues/4434. – stakx

Répondre

7

L'astuce ne fonctionne que si vous n'utilisez pas

var x = new SomeClass(); 

mais utilisez l'interface explicite qui hérite de IHideObjectMembers

ISomeInterface x = new SomeClass(); 

var prend le type de la classe concrète. Ainsi, IntelliSense recherchera object.ToString() et non IHideObjectMembers.ToString(). Le premier n'est pas décoré avec le EditorBrowsableAttribute tandis que le dernier est.

Daniel Cazzulino fait référence à interfaces explicitement dans son poste

que nous avons fait cela avec toutes les interfaces dans notre API couramment

12

Avant une solution de travail a été publiée (voir ci-dessus), je l'ai étudié et expérimenté un peu, et a trouvé ceci:

  • IntelliSense doit être dit d'ignorer les propriétés marquées d'un EditorBrowsableState égal Advanced ou Never . Ceci est réalisé dans Visual Studio via l'élément de menu Outils → ... optionséditeur de texteC#IntelliSenseMasquer les membres avancés.

  • La astuce IHideObjectMembers fonctionne uniquement à partir des "autres" assemblys, et uniquement lorsque le projet qui utilise IHideObjectMembers n'est pas chargé dans la même solution.

  • Hiding membres non statiques de object parfois ne fonctionne pas lorsque vous avez terminé via une interface IHideObjectMembers, mais il fonctionne lorsque les méthodes sont explicitement remplacées directement dans la classe ... ce qui rend malheureusement la technique se cachant montré moins utile.

Les sources de ces indices:

+0

Intéressant. Je n'ai pas été en mesure de le faire fonctionner à l'extérieur ou à l'intérieur de la solution en utilisant VS 2010. –

+1

+1 peut croire que c'est seulement la deuxième upvote sur votre travail. (Essayer de diagnostiquer le même sur VS10) –

+1

NB n'était pas un problème VS10 - tout ce qu'il change est qu'il n'y a pas de paramètre Masquer les membres avancés à vérifier. Cela fonctionne tant que ce n'est pas une référence de projet. Un point négatif que j'ai remarqué est que Ctrl., Implémenter l'interface explicitement génère maintenant les 4 méthodes (qu'il ne s'offre que si une 'méthode réelle' est manquante) mais je suppose que la vie continuera. (La même négative s'applique dans VS08) –

4

Cette astuce fonctionne uniquement lorsque vous utilisez des types inclus dans les DLL référencées. Ces assemblys référencés ne peuvent pas être des références de projet Visual Studio. Si vous faites référence à la DLL elle-même, alors l'astuce devrait fonctionner pour vous.