2010-07-23 162 views
13

我想基於richtextbox控件將智能感知添加到C#代碼編輯器。到目前爲止,我已經解析了輸入的文本以查找所有變量及其類型(效果很好)。下拉框運行良好。我無法得到的是下拉列表框的正確選項列表。實現Visual Studio智能感知

我怎樣可以得到下面的列表中,編程:

alt text

我已經編譯的變量及其類型的列表,所以當用戶按下.我知道我有一個變量c鍵入Color。我只需要知道要調用哪個函數來獲取我需要的下拉框的列表。

我試過這段代碼:http://www.codeproject.com/KB/cs/diy-intellisense.aspx但無法讓它正常工作。我也讀過StackOverflow上的大量其他線程無濟於事。我真的很想完成這個,而不是使用別人的插件編輯器組件。

任何提示將不勝感激。謝謝。

+0

哦,我想看看是否有人知道如何掛鉤到現有的intellisense實現,而不是重新實現它:) – 2010-07-23 20:00:30

+0

出於興趣,我很驚訝你沒有來Type.GetMembers自然結論。你知道你需要關於類型的信息,那麼爲什麼不看看Type類? – 2010-07-23 20:05:14

+0

@Kieren Johnstone:這是我第一次嘗試,但是我收到了錯誤的結果。該列表正在填充,好像我輸入了'Color.'而不是變量名稱。所以,我認爲我走錯了路。 – BoltBait 2010-07-24 02:32:49

回答

4

如果您知道該類型,您應該能夠反映該類型並獲取所需的所有信息。

Type.GetMembers可能是你最好的選擇。您可能需要第二個電話來得到任何靜態方法還有:

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

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

每個的MemberInfo對象就能告訴你MemberType(屬性,字段,方法,事件等)

只需使用當用戶鍵入一個變量(如c在您的示例中),然後輸入.並使用staticMembers時,instanceMembers用戶輸入類型名稱(如Color在您的示例中),然後輸入.

+0

是的,我相信,Type.GetFields(),Type.GetConstructors()和Type.GetEvents()將是其他需要的調用。 – 2010-07-23 19:45:08

+1

@Nate Dudek - 所有這些都可以通過致電GetMembers來處理。 – 2010-07-23 19:50:49

+0

不知道。你每天都會學到一些知識! – 2010-07-23 20:03:09

1

假設你有一個名字表類型這應該給你一個體面的開始:

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

因此,也許你可以擴展你的姓名錶包括:

Type 
Context 
Members 
+0

我將名稱和類型存儲爲一對字符串。 – BoltBait 2010-07-23 19:44:48

+1

@BoltBait - 您可能想創建一個漂亮的結構,並將其類型保存爲Type類型實例。 – ChaosPandion 2010-07-23 19:46:43

+0

謝謝。存儲'Type'使得它更容易。 – BoltBait 2010-07-24 04:11:54

1

你會想在一定程度上使用反射。如果您有類型或類型的名稱,您可以獲得一個Type實例。

E.g.

然後你就可以說Type對象調用Type.GetMembers(),在這裏看到:

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

...你就會有它的名稱爲MemberInfo對象的數組(.Name ),成員類型(.MemberType)以及其他信息(如參數列表)。

希望有所幫助。