use*_*411 3 .net c# vb.net .net-4.0 visual-studio-2010
我在Visual Studio 2010中使用VB.NET.是否有任何功能或工具可以自动完成任何.Net类型名称到完全合格的名称?
我的意思是一个工具/功能,实际上将源代码从简短的名称更改为完全限定的名称,如下所示:
从String到System.String
从此Process.Start到此System.Diagnostics.Process.Start
更新:
感谢ReSharper的建议.但我不准备购买它或奖励商业产品的建议.对不起.我应该清楚地说明这个要求.在问这个问题之前我已经尝试过ReSharper了.
Ale*_*Aza 13
Resharper能够做到这一点.
虽然Resharper不是免费的,但绝对值得购买.一旦开始使用Resharper,没有它就无法继续.
显示下面的步骤,因为如何执行此操作并不是很简单:
打开VS并转到menu Rehsarper=> Options=> Languages=> C#=> Namespace Import.选择Use fully qualified names.默认情况下Insert using directives when necessary已选中.

从现在开始,无论何时使用Alt+Enter解析命名空间,Resharper都将解析完全限定的命名空间.
转到Rehsarper=> Options=> Tools=> Code cleanup.点击Add按钮添加新的清理配置文件.为新配置文件命名,例如Namespaces Reformat.选中Optimizing using directives复选框.

右键单击项目并选择Cleanup Code...,或使用快捷方式Ctrl+E, Ctrl+C.选择先前创建的配置文件并点击Run按钮

测试
原始代码:
using System;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Test");
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果代码:
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("Test");
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个适用于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
Run Code Online (Sandbox Code Playgroud)
我们还需要一个基于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
Run Code Online (Sandbox Code Playgroud)
然后是一个循环所有可用项目以找到其中一个候选项的函数
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
Run Code Online (Sandbox Code Playgroud)
两个小助手功能
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
Run Code Online (Sandbox Code Playgroud)
然后我们可以根据您的使用方式编写可以改变的主要功能.
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
942 次 |
| 最近记录: |