2010-07-23 5 views
13

J'essaie d'ajouter l'éditeur de code Intellisense à C# basé sur le contrôle richtextbox. Jusqu'à présent, je l'ai analysé le texte entré pour trouver toutes les variables et leurs types (fonctionne bien). La boîte déroulante fonctionne bien. Ce que je ne peux pas obtenir est une liste appropriée d'options pour la liste déroulante.Implémentation de Visual Studio Intellisense

Comment puis-je obtenir la liste suivante, programme:

alt text

J'ai déjà compilé une liste de variables et leurs types, de sorte que lorsque l'utilisateur appuie . Je sais que j'ai une c variable tapez Color. J'ai juste besoin de savoir quelle fonction appeler pour obtenir la liste dont j'ai besoin pour la liste déroulante.

J'ai essayé ce code: http://www.codeproject.com/KB/cs/diy-intellisense.aspx mais je n'ai pas réussi à le faire fonctionner correctement. J'ai également lu une tonne d'autres discussions sur StackOverflow en vain. Je voudrais vraiment finir ceci au lieu d'utiliser quelqu'un d'autre composant de l'éditeur drop-in.

Tous les conseils seraient appréciés. Merci.

+0

Ooh, je voudrais voir si quelqu'un sait comment se connecter à l'implémentation d'intellisense existante, plutôt que de la ré-implémenter :) –

+0

Par intérêt, je suis surpris que vous ne soyez pas arrivé à Type.GetMembers conclusion naturellement. Vous savez que vous avez besoin d'informations sur un type, alors pourquoi ne pas regarder dans la classe Type? –

+0

@Kieren Johnstone: C'était mon premier essai, mais je recevais de mauvais résultats. La liste était remplie comme si j'avais tapé 'Color.' au lieu du nom de la variable. Donc, j'ai supposé que j'étais sur la mauvaise voie. – BoltBait

Répondre

4

Si vous connaissez le type, vous devriez être capable de réfléchir sur le type et obtenir toutes les informations dont vous avez besoin.

Type.GetMembers serait probablement votre meilleur pari. Vous devrez peut-être un deuxième appel pour obtenir des méthodes statiques ainsi:

var instanceMembers = typeof(Color) 
         .GetMembers(BindingFlags.Instance | BindingFlags.Public); 

var staticMembers = typeof(Color) 
        .GetMembers(BindingFlags.Static | BindingFlags.Public); 

Chaque objet MemberInfo sera en mesure de vous dire la MemberType (Propriété, Champ, Méthode, événement, etc.)

Il suffit d'utiliser instanceMembers lorsque l'utilisateur tape une variable (par exemple c dans votre exemple) suivi de . et utilisez le staticMembers lorsque l'utilisateur tape un nom de type (par exemple Color dans votre exemple) suivi de ..

+0

Oui, Type.GetFields(), Type.GetConstructors() et Type.GetEvents() seront les autres appels nécessaires, je crois. –

+1

@Nate Dudek - Tout cela pourrait être géré par l'appel de GetMembers. –

+0

Je ne le savais pas. Tu apprends quelque chose que tu savais tous les jours! –

1

En supposant que vous avez une table de nom avec des types cela devrait vous donner un bon départ:

var type = _names[name].Type; 
var members = type.GetMembers(); // Check context to grab private methods? 

vous pouvez donc peut-être prolonger votre table de nom pour inclure:

Type 
Context 
Members 
+0

Je stocke le nom et le type en tant que paire de chaînes. – BoltBait

+1

@BoltBait - Vous souhaiterez peut-être créer une structure agréable et conserver le type en tant qu'instance 'Type' à la place. – ChaosPandion

+0

Merci. Stocker le 'Type' l'a rendu beaucoup plus facile. – BoltBait

1

Vous voudriez utiliser la réflexion dans une certaine mesure. Si vous avez le type, ou le nom du type, vous pouvez obtenir une instance Type.

E.g.

Ensuite, vous pouvez appeler Type.GetMembers() sur cet objet Type, voir ici:

http://msdn.microsoft.com/en-us/library/424c79hc.aspx

... et vous aurez un tableau de MemberInfo objets qui ont le nom (.Name), type du membre (.MemberType), et à partir de cette autre information, comme les listes de paramètres.

Espérons que ça aide.

Questions connexes