[英]Is there any function or tool (free) to auto complete any .Net type name to fully qualified one?
我正在將 VB.NET 與 Visual Studio 2010 一起使用。是否有任何 function 或工具可以自動將 any.Net 類型名稱完成為完全合格的名稱?
我的意思是一個工具/功能,它實際上將源代碼從簡寫更改為完全限定名稱,如下所示:
從String
到System.String
從Process.Start
到這個System.Diagnostics.Process.Start
更新:
感謝 ReSharper 的建議。 但我不准備購買它或獎勵商業產品建議。 對此感到抱歉。 我應該清楚地說明我的問題。 在問這個問題之前,我已經嘗試過 ReSharper。
Resharper能夠做到這一點。
雖然 Resharper 不是免費的,但絕對值得購買。 一旦開始使用 Resharper,沒有它您將無法繼續。
下面逐步顯示,因為如何做到這一點並不簡單:
打開 VS 和 go 到菜單Rehsarper
=> Options
=> Languages
=> C#
=> Namespace Import
。 Select Use fully qualified names
。 默認情況下Insert using directives when necessary
被選中。
從現在開始,每當您使用Alt+Enter
解析命名空間時,Resharper 都會解析完全限定的命名空間。
Go 到Rehsarper
=> Options
=> Tools
=> Code cleanup
。 點擊Add
按鈕添加新的清理配置文件。 為新配置文件命名,例如Namespaces Reformat
。 選中Optimizing using directives
復選框。
右鍵單擊項目和 select Cleanup Code...
,或使用快捷鍵Ctrl+E, Ctrl+C
。 Select 之前創建的配置文件並點擊Run
按鈕。
測試
原始代碼:
using System;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Test");
}
}
}
結果代碼:
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("Test");
}
}
}
這是一個適用於 C# 代碼的宏。
當我在 VB.Net 項目上對其進行測試時,它不適用於程序集引用中的類型。 似乎 VB.Net 的項目代碼 model 不包括外部類型。
無論如何,我在這里包含代碼。 也許其他人知道如何為 VB 做
首先我們需要一個找到當前上下文的 function
Private Function FindCodeElement(ByVal caretPosition As TextPoint, ByVal elems As CodeElements) As CodeElement
If elems Is Nothing Then Return Nothing
Return elems.Cast(Of CodeElement) _
.Where(Function(x) x.StartPoint.LessThan(caretPosition) AndAlso _
x.EndPoint.GreaterThan(caretPosition)) _
.Select(Function(x) If(FindCodeElement(caretPosition, GetMembers(x)), x)) _
.FirstOrDefault()
End Function
我們還需要一個基於 using/import 語句創建所有候選名稱的 function
Private Sub FindAllCandidates(ByVal elem As Object, ByVal className As String)
If TypeOf elem Is CodeFunction Then
FindAllCandidates(CType(elem, CodeFunction).Parent, className)
ElseIf TypeOf elem Is CodeClass Then
mCandidates.Add(CType(elem, CodeClass).FullName & "." & className)
FindAllCandidates(CType(elem, CodeClass).Parent, className)
ElseIf TypeOf elem Is CodeStruct Then
mCandidates.Add(CType(elem, CodeStruct).FullName & "." & className)
FindAllCandidates(CType(elem, CodeStruct).Parent, className)
ElseIf TypeOf elem Is CodeNamespace Then
mCandidates.Add(CType(elem, CodeNamespace).FullName & "." & className)
For Each ns As String In CType(elem, CodeNamespace).Members.OfType(Of CodeImport) _
.Select(Function(x) x.Namespace)
mCandidates.Add(ns & "." & className)
Next
FindAllCandidates(CType(elem, CodeNamespace).Parent, className)
ElseIf TypeOf elem Is FileCodeModel Then
For Each ns As String In CType(elem, FileCodeModel).CodeElements.OfType(Of CodeImport) _
.Select(Function(x) x.Namespace)
mCandidates.Add(ns & "." & className)
Next
End If
End Sub
然后是一個 function 循環所有可用項目以找到其中一個候選人
Private Function FindClassInCodeElements(ByVal elems As CodeElements) As CodeElement
If elems Is Nothing Then Return Nothing
For Each elem As CodeElement In elems
If IsClassType(elem) Then
If mCandidates.Contains(elem.FullName) Then Return elem
ElseIf TypeOf elem Is CodeNamespace Then
For Each candidate As String In mCandidates
If candidate.StartsWith(elem.FullName) Then
Dim found As CodeElement = FindClassInCodeElements(GetMembers(elem))
If found IsNot Nothing Then Return found
Exit For
End If
Next
End If
Next
Return Nothing
End Function
兩個小輔助函數
Private Function IsClassType(ByVal elem As CodeElement) As Boolean
Return TypeOf elem Is CodeClass OrElse TypeOf elem Is CodeStruct OrElse TypeOf elem Is CodeInterface
End Function
Private Function GetMembers(ByVal elem As CodeElement) As CodeElements
If TypeOf elem Is CodeClass Then
Return CType(elem, CodeClass).Members
ElseIf TypeOf elem Is CodeNamespace Then
Return CType(elem, CodeNamespace).Members
ElseIf TypeOf elem Is CodeStruct Then
Return CType(elem, CodeStruct).Members
ElseIf TypeOf elem Is CodeInterface Then
Return CType(elem, CodeInterface).Members
End If
Return Nothing
End Function
然后我們可以編寫主要的 function,您可以根據自己的使用方式對其進行更改。
Dim mCandidates As New HashSet(Of String)
Sub ExpandFullNameOfSelection()
Dim selection As EnvDTE.TextSelection = CType(DTE.ActiveDocument.Selection(), EnvDTE.TextSelection)
' Assume type is selected
Dim className As String = selection.Text
' Find current context
Dim currentFunction As CodeElement = FindCodeElement(selection.ActivePoint, DTE.ActiveDocument.ProjectItem.FileCodeModel.CodeElements)
mCandidates.Clear()
FindAllCandidates(currentFunction, className)
Dim classType As CodeElement = DTE.Solution.Projects.Cast(Of Project) _
.Where(Function(x) x.CodeModel IsNot Nothing) _
.Select(Function(x) FindClassInCodeElements(x.CodeModel.CodeElements)) _
.FirstOrDefault(Function(x) x IsNot Nothing)
If classType IsNot Nothing Then
selection.Text = classType.FullName ' replace with full name
End If
End Function
JetBrains 的 ReSharper 可以通過“代碼清理” function以及許多其他代碼更改(例如顯式類型使用而不是var
等)來執行此操作。
請注意,我不是附屬機構,而是 R# 的忠實粉絲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.