加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 是否有任何功能或工具(免费)自动完成任何.Net类型名称到完

发布时间:2020-12-15 19:59:58 所属栏目:百科 来源:网络整理
导读:我在Visual Studio 2010中使用VB.NET.是否有任何功能或工具可以自动完成任何.Net类型名称到完全合格的名称? 我的意思是一个工具/功能,实际上将源代码从简短的名称更改为完全限定的名称,如下所示: 从String到System.String 从Process.Start到此System.Diagn
我在Visual Studio 2010中使用VB.NET.是否有任何功能或工具可以自动完成任何.Net类型名称到完全合格的名称?

我的意思是一个工具/功能,实际上将源代码从简短的名称更改为完全限定的名称,如下所示:

从String到System.String

从Process.Start到此System.Diagnostics.Process.Start

更新:

Thanks for ReSharper suggestion. But
I’m not prepared to buy it or award
bounty for a commercial product
suggestion. Sorry about that. I should
make my question clear about that
requirement. I already tried ReSharper
before asking this question.

解决方法

这是一个适用于C#代码的宏.

当我在VB .Net项目上测试它时,它不适用于程序集引用中的类型.似乎VB.Net的项目代码模型排除了外部类型.

无论如何我在这里包含代码.也许别人知道如何为VB做这件事

首先,我们需要一个查找当前上下文的函数

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语句创建所有候选名称的函数

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

然后是一个循环所有可用项目以找到其中一个候选项的函数

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

然后我们可以根据您的使用方式编写可以改变的主要功能.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读