Реализация Visual Studio Intellisense - PullRequest
13 голосов
/ 23 июля 2010

Я пытаюсь добавить Intellisense в редактор кода C # на основе элемента управления richtextbox.До сих пор я разбирал введенный текст, чтобы найти все переменные и их типы (работает хорошо).Раскрывающийся список работает хорошо.Что я не могу получить, так это правильный список параметров для выпадающего списка.

Как получить следующий список программным путем:

alt text

Я уже составил список переменных и их типов, поэтому, когда пользователь нажимает ., я знаю, что у меня есть переменная c типа Color.Мне просто нужно знать, какую функцию вызывать, чтобы получить список, который мне нужен для выпадающего списка.

Я пробовал этот код: http://www.codeproject.com/KB/cs/diy-intellisense.aspx, но не смог заставить его работать должным образом,Я также прочитал тонну других тем на StackOverflow безрезультатно.Я действительно хотел бы закончить это вместо того, чтобы использовать чей-либо другой компонент редактора.

Будем благодарны за любые подсказки.Спасибо.

Ответы [ 3 ]

4 голосов
/ 23 июля 2010

Если вы знаете тип, вы сможете отразить тип и получить всю необходимую информацию.

Type.GetMembers , вероятно, будет вашим лучшим выбором.Вам также может понадобиться второй вызов для получения любых статических методов:

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

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

Каждый объект MemberInfo сможет сообщить вам MemberType (свойство, поле, метод, событие и т. Д.)

Просто используйте instanceMembers, когда пользователь вводит переменную (например, c в вашем примере), затем . и используйте staticMembers, когда пользователь вводит имя типа (например, Color в вашем примере)затем ..

1 голос
/ 23 июля 2010

Вы бы хотели использовать отражение до некоторой степени.Если у вас есть тип или имя типа, вы можете получить экземпляр Type.

Например, Type.GetType("System.Int32")

Затем вы можете вызвать Type.GetMembers() для этого Typeобъект, см. здесь:

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

... и у вас будет массив MemberInfo объектов с именем (.Name)тип члена (.MemberType) и другая информация, например списки параметров.

Надеюсь, это поможет.

1 голос
/ 23 июля 2010

Если у вас есть таблица имен с типами, это должно дать вам хорошее начало:

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

Так что, возможно, вы можете расширить свою таблицу имен, включив в нее:

Type
Context
Members
...