是否有自动的任何功能或工具(免费)完成任何.NET类型名称完全合格的呢? [英] Is there any function or tool (free) to auto complete any .Net type name to fully qualified one?

查看:296
本文介绍了是否有自动的任何功能或工具(免费)完成任何.NET类型名称完全合格的呢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用VB.NET与Visual Studio 2010中是否有任何功能或工具来自动完成任何.NET类型名称完全合格的呢?

我的意思是一个工具/功能,实际上更改源$ C ​​$ C 从手短到像下面的完全合格的名称:

字符串 System.String

的Process.Start 这个 System.Diagnostics.Process.Start

更新:

  

感谢ReSharper的建议。但   我不是prepared买或裁决   奖金对于商业产品   建议。 很抱歉,。我应该   使我的问题清楚了   需求。我已经尝试过的ReSharper   之前问这个问题。

解决方案

下面是对C适用#code宏。

当我测试了一个VB .NET项目它在程序集引用类型没有工作。好像该项目$ C $下VB.Net模型不包括外部类型。

我包括code在这里反正。也许别人知道如何做到这一点的VB


首先,我们需要一个函数,发现当前上下文

 专用功能查找codeElement(BYVAL caretPosition作为TextPoint,BYVAL elems作为codeElements)作为codeElement
    如果elems是没有再回到没有
    返回elems.Cast(中codeElement)_
                。凡(功能(X)x.StartPoint.LessThan(caretPosition)AndAlso _
                                   x.EndPoint.GreaterThan(caretPosition))_
                。选择(功能(x)如果(查找codeElement(caretPosition,GetMembers(X))中,x))_
                .FirstOrDefault()
端功能
 

我们还需要创造基于使用的所有候选人姓名的函数/ import语句

 私人小组FindAllCandidates(BYVAL ELEM为对象,BYVAL类名作为字符串)
    如果TypeOf运算ELEM为codeFunction然后
        FindAllCandidates(CTYPE(ELEM,codeFunction).Parent,类名)
    elseif的TypeOf运算ELEM为codeClass然后
        mCandidates.Add(CTYPE(ELEM,codeClass).FullName和放大器;&AMP,类名)
        FindAllCandidates(CTYPE(ELEM,codeClass).Parent,类名)
    elseif的TypeOf运算ELEM为codeStruct然后
        mCandidates.Add(CTYPE(ELEM,codeStruct).FullName和放大器;&AMP,类名)
        FindAllCandidates(CTYPE(ELEM,codeStruct).Parent,类名)
    elseif的TypeOf运算ELEM为codeNamespace然后
        mCandidates.Add(CTYPE(ELEM,codeNamespace).FullName和放大器;&AMP,类名)
        对于每纳秒作为字符串在CTYPE(ELEM,codeNamespace).Members.OfType(中codeImport)_
                                                                   。选择(功能(X)x.Namespace)
            mCandidates.Add(NS&安培;。&放大器;类名)
        下一个
        FindAllCandidates(CTYPE(ELEM,codeNamespace).Parent,类名)
    elseif的TypeOf运算ELEM是文件codeModel然后
        对于每纳秒作为字符串在CTYPE(ELEM,文件codeModel)。codeElements.OfType(中codeImport)_
                                                                        。选择(功能(X)x.Namespace)
            mCandidates.Add(NS&安培;。&放大器;类名)
        下一个
    结束如果
结束小组
 

然后一个函数,循环所有可用的物品,找到候选人之一

 专用功能FindClassIn codeElements(BYVAL elems作为codeElements)作为codeElement
    如果elems是没有再回到没有
    对于每个ELEM作为codeElement在elems
        如果IsClassType(ELEM)然后
            如果mCandidates.Contains(elem.FullName)然后返回ELEM
        elseif的TypeOf运算ELEM为codeNamespace然后
            每名候选人作为字符串在mCandidates
                如果candidate.StartsWith(elem.FullName)然后
                    DIM发现作为codeElement = FindClassIn codeElements(GetMembers(ELEM))
                    如果找到状态并没有任何然后返回找到
                    退出对于
                结束如果
            下一个
        结束如果
    下一个
    返回任何结果
端功能
 

两个小助手功能

 专用功能Is​​ClassType(BYVAL ELEM作为codeElement)作为布尔
    返回TypeOf运算ELEM为codeClass OrElse运算TypeOf运算ELEM为codeStruct OrElse运算TypeOf运算ELEM为codeInterface
端功能

专用功能GetMembers(BYVAL ELEM作为codeElement)作为codeElements
    如果TypeOf运算ELEM为codeClass然后
        返回CTYPE(ELEM,codeClass).Members
    elseif的TypeOf运算ELEM为codeNamespace然后
        返回CTYPE(ELEM,codeNamespace).Members
    elseif的TypeOf运算ELEM为codeStruct然后
        返回CTYPE(ELEM,codeStruct).Members
    elseif的TypeOf运算ELEM为codeInterface然后
        返回CTYPE(ELEM,codeInterface).Members
    结束如果
    返回任何结果
端功能
 

然后我们就可以写,你可以改变这取决于你如何想使用它的主要功能。

 昏暗mCandidates作为新的HashSet(串)

子ExpandFullNameOfSelection()
    昏暗的选择作为EnvDTE.TextSelection = CTYPE(DTE.ActiveDocument.Selection(),EnvDTE.TextSelection)
    假设类型选择
    昏暗的className作为字符串= selection.Text

    查找当前上下文
    昏暗currentFunction作为codeElement =找到codeElement(selection.ActivePoint,DTE.ActiveDocument.ProjectItem.File codeModel。codeElements)

    mCandidates.Clear()
    FindAllCandidates(currentFunction,类名)

    昏暗classType所为codeElement = DTE.Solution.Projects.Cast(项目)_
                                                        。凡(功能(x)x。codeModel IsNot运算没有)_
                                                        。选择(功能(X)FindClassIn codeElements(X,codeModel。codeElements))_
                                                        .FirstOrDefault(功能(x)x IsNot运算没有什么)
    如果classType所状态并没有任何然后
        selection.Text = classType.FullName'替换全名
    结束如果
端功能
 

I'm using VB.NET with Visual Studio 2010. Is there any function or tool to auto complete any .Net type name to fully qualified one?

I mean a tool/function that actually changing the source code from short hand to fully qualified name like following:

From String to System.String

From Process.Start to this System.Diagnostics.Process.Start

UPDATE:

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.

解决方案

Here is a macro that works fine for C# code.

When I tested it on a VB .Net project it didn't work for types in assembly references. Seems like the project code model for VB.Net excludes external types.

I include the code here anyway. Maybe someone else knows how to do it for VB


First we need a function that finds the current context

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

We also need a function that create all candidate names based on using/import statements

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

And then a function that loops all available items to find one of the candidates

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

Two small helper functions

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

And then we can write the main function which you can alter depending on how you want to use it.

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

这篇关于是否有自动的任何功能或工具(免费)完成任何.NET类型名称完全合格的呢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆