C# 实现VisualStudioIntelliSense

C# 实现VisualStudioIntelliSense,c#,intellisense,C#,Intellisense,我正在尝试将Intellisense添加到基于richtextbox控件的C代码编辑器中。到目前为止,我已经通过解析输入的文本找到了所有变量及其类型(效果很好)。下拉框工作正常。我无法获得下拉列表框的正确选项列表 如何以编程方式获取以下列表: 我已经编译了一个变量及其类型的列表,因此当用户按下时,我知道我有一个c类型Color的变量。我只需要知道调用什么函数来获取下拉框所需的列表 我尝试过此代码:但无法使其正常工作。我还阅读了大量关于StackOverflow的其他线程,但都没有用。我真的很想

我正在尝试将Intellisense添加到基于richtextbox控件的C代码编辑器中。到目前为止,我已经通过解析输入的文本找到了所有变量及其类型(效果很好)。下拉框工作正常。我无法获得下拉列表框的正确选项列表

如何以编程方式获取以下列表:

我已经编译了一个变量及其类型的列表,因此当用户按下
时,我知道我有一个
c
类型
Color
的变量。我只需要知道调用什么函数来获取下拉框所需的列表

我尝试过此代码:但无法使其正常工作。我还阅读了大量关于StackOverflow的其他线程,但都没有用。我真的很想完成这个,而不是使用其他人的下拉编辑器组件


如有任何提示,将不胜感激。谢谢。

如果您知道该类型,您应该能够反思该类型并获得所需的所有信息

这可能是你最好的选择。您可能还需要第二次调用来获取任何静态方法:

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

var staticMembers = typeof(Color)
                    .GetMembers(BindingFlags.Static | BindingFlags.Public);
每个MemberInfo对象将能够告诉您MemberType(属性、字段、方法、事件等)


当用户键入变量(如示例中的
c
)时,只需使用
instanceMembers
,然后使用
,当用户键入类型名称(如示例中的
Color
)时,使用
staticMembers
)然后是

,假设您有一个包含类型的名称表,这将为您提供一个良好的开端:

var type = _names[name].Type;
var members = type.GetMembers(); // Check context to grab private methods?
因此,您可以扩展您的名称表以包括:

Type
Context
Members

你会想在某种程度上使用反射。如果您有类型或类型名称,则可以获得一个
type
实例

例如,
Type.GetType(“System.Int32”)

然后可以对该
Type
对象调用
Type.GetMembers()
,请参见此处:

…您将拥有一个
MemberInfo
对象数组,这些对象具有名称(
.name
)、成员类型(
.MemberType
)以及其他信息,如参数列表


希望有帮助。

我将名称和类型存储为一对字符串。@BoltBait-您可能希望创建一个好的结构,并将该类型保存为
类型
实例。谢谢。存储
Type
使它更容易。是的,我相信,Type.GetFields()、Type.GetConstructors()和Type.GetEvents()将是需要的其他调用。@Nate Dudek-所有这些都可以通过调用GetMembers来处理。@Nate Dudek-是的。只需查看类成员的任何MSDN文档页面,就可以了解哪些符合条件。ObservaleCollection是一个很好的方法:我调用GetMembers时缺少的是BindingFlags。谢谢哦,我想看看是否有人知道如何连接到现有的intellisense实现,而不是重新实现:)出于兴趣,我很惊讶你没有自然地得出Type.GetMembers结论。你知道你需要关于类型的信息,那么为什么不看看类型类呢?@Kieren Johnstone:那是我第一次尝试,但是我得到了错误的结果。列表正在填充,就好像我键入了
Color.
而不是变量名一样。所以,我认为我走错了方向。