Внедрение 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
) и из этой другой информации, например списков параметров.
Надеюсь, что это поможет.