簡體   English   中英

是否有任何 function 或工具(免費)可以自動完成 any.Net 類型名稱到完全合格的名稱?

[英]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 類型名稱完成為完全合格的名稱?

我的意思是一個工具/功能,它實際上將源代碼從簡寫更改為完全限定名稱,如下所示:

StringSystem.String

Process.Start到這個System.Diagnostics.Process.Start

更新:

感謝 ReSharper 的建議。 但我不准備購買它或獎勵商業產品建議。 對此感到抱歉 我應該清楚地說明我的問題。 在問這個問題之前,我已經嘗試過 ReSharper。

Resharper能夠做到這一點。

雖然 Resharper 不是免費的,但絕對值得購買。 一旦開始使用 Resharper,沒有它您將無法繼續。

下面逐步顯示,因為如何做到這一點並不簡單:

  1. 下載並安裝 Resharper。
  2. 打開 VS 和 go 到菜單Rehsarper => Options => Languages => C# => Namespace Import Select Use fully qualified names 默認情況下Insert using directives when necessary被選中。

    在此處輸入圖像描述

    從現在開始,每當您使用Alt+Enter解析命名空間時,Resharper 都會解析完全限定的命名空間。

  3. Go 到Rehsarper => Options => Tools => Code cleanup 點擊Add按鈕添加新的清理配置文件。 為新配置文件命名,例如Namespaces Reformat 選中Optimizing using directives復選框。在此處輸入圖像描述

  4. 右鍵單擊項目和 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM