2012-05-14 107 views
2

當我書面方式:C#ArgumentOutOfRangeException參數的智能感知

throw new ArgumentOutOfRangeException("") 

配售插入符引號之間,然後按Ctrl +空格鍵打開智能感知實際上做了什麼!

是炫我奇麗的是,它實際上是從法建議的參數名:

ScreenShot

可有人請向我解釋它是如何實現?

如何在這種級別添加自定義智能感知?

更新: 正如一些人指出的 - 這intellisense不會正常彈出。

我使用的是ReSharper 6.1,我可以控制在ReSharper> Options> Intellisense> Autopopup> [C#]中是否會彈出intellisense字符串文字。

不過,我想知道我如何能夠自己創建這樣的intellisense。

+1

我不明白的是智能感知,你有什麼VS擴展安裝可能會提供此功能? – Jon

+0

@Jon感謝您指出。查看更新:) – SimpleVar

回答

4

我想你應該看看this article。 另外還有另外一個Stack Overflow question與你的很相似,可能會給你一些提示。

如何實現concretelly我不知道,但我不認爲你甚至不需要使用反射,因爲即使是「正常」的IntelliSense IntelliSense工作,而無需先建立你的項目。例如,只需向項目中添加一個新類,就可以將其用於IntelliSense。我認爲ReSharper使用了同樣的機制。

+0

這正是我一直在尋找的。幹得好,謝謝你! – SimpleVar

-2

這很明顯看着你剛纔在決定拋出它的條件中使用的變量。

+0

我可能會失去if語句 - 它與intellisense無關。即使這樣做,你的回答也無助於我理解這種智能感知如何完成。從邏輯上講,我可以告訴自己應該拋出'num'。我不需要「邏輯」。 – SimpleVar

0

我在Reflector中看不到任何關於ArgumentOutOfRangeException或ArgumentException類型的特殊內容,所以我想這是硬編碼到Visual Studio中的東西。猜測,我會玩一個名爲String paramName的Exception參數,它繼承自ArgumentException或其他組合。

編輯:
我在VS 2010 SP1中也沒有收到此intellisense提示。我會翻看你的擴展,也許看看他們的文檔。如果他們是開源的,你可能會發現它是如何實現的。

+0

這是一個好主意,試圖從異常中派生出來,但即使從ArgumentOutOfRangeException本身派生出來,並且使用完全相同的命名委託給它的所有ctors也不起作用。你的擴展是正確的 - 更新問題。 – SimpleVar

4

Resharper增加了許多有用的功能,遠遠超出了Visual Studio通過Intellisense本地提供的功能。例如,在ASP中。NET MVC,ReSharper的會自動建議控制器動作名稱:

// Resharper will give suggestions based on controller action names 
@Html.Action("Show 

在你的問題,ReSharper的具有顯着的參數傳遞給ArgumentOutOfRangeException構造爲需要的參數,以當前方法的名稱。所以當你輸入字符串時,它會建議當前方法參數的名稱。

這樣寫自己的智能感知需要付出很大的努力。你基本上會重複Jetbrains的人花費了大量資源來製造Resharper。

如果你想插入Resharper的API到create your own plugin,它需要較少的努力,但它仍然是非常乏味。但是,如果你只是想編寫你自己的方法,它需要一個字符串參數作爲其中一個調用方法參數的名稱,Jetbrains允許你使用他們的External Annotations註釋你的方法參數。在這種情況下,您可以使用InvokerParameterNameAttribute

+0

+1關於InvokerParameterNameAttribute的重要提示,以及一般的外部註釋!接受紀堯姆的回答,因爲他是第一個,並提供了很好的答案。 – SimpleVar

+0

@YoryeNathan:我想我應該給出一個更簡潔的答案,而不是花時間來完全回答這個問題。 – StriplingWarrior

+0

我通常會做的是給出一個簡潔的答案,然後編輯它來詳細說明。真的很好的回答,最後:) – SimpleVar

-1

公共類Form1中

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    connect() 

End Sub 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
    OpenFileDialog1.Filter = "image file(*.jpg *.bmp *.png)|*.jpg; *.bmp; *.png| all files (*.*)|*.*" 
    If OpenFileDialog1.ShowDialog <> Windows.Forms.DialogResult.Cancel Then 
     PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName) 
    End If 
End Sub 

Private Sub OpenFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk 
    If OpenFileDialog1.FileName <> Nothing Or OpenFileDialog1.FileName <> "" Then 
     txtname.Text = OpenFileDialog1.FileName.Substring(_ 
     OpenFileDialog1.FileName.LastIndexOf("\") + 1, _ 
     (OpenFileDialog1.FileName.LastIndexOf(".", 0) - (OpenFileDialog1.FileName.LastIndexOf("\") + 1))) 

    End If 
End Sub 

末級

+0

它寫出argumentoutofrangeexception未處理如何解決它 – user3808778