Внедрение Visual Studio Intellisense

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

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

alt text

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

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

Любые подсказки будут оценены. Спасибо.

Ответы

Ответ 1

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

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 в вашем примере), за которым следует ..

Ответ 2

Предполагая, что у вас есть таблица имен с типами, это должно дать вам достойный старт:

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

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

Type
Context
Members

Ответ 3

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

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

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

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

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

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