VS 2010 - простой способ скопировать полное имя типа класса / интерфейса? - PullRequest
3 голосов
/ 11 февраля 2011

Есть ли способ скопировать полное имя типа класса / интерфейса / и т.д.в Visual Studio в буфер обмена?В частности, они нужны мне для конфигурации Castle Windsor, и я хотел бы выяснить, как это сделать без особых усилий.(Пример: выделите IInterface в редакторе кода и добавьте My.Full.Namespace.Is.Here.IInterface в буфер обмена.)

VS помещает полное имя типа в комбинированный список только для чтения в верхнемслева (что совершенно бесполезно для копирования);Кто-нибудь знает способ?

(У меня есть ReSharper, если есть способ сделать это с помощью этого.)

1 Ответ

2 голосов
/ 11 февраля 2011

Вот макрос, который должен помочь вам.Обработка ошибок ужасна, но я не могу собрать больше, я абсолютно ненавижу VB:)

Также обратите внимание, что он захватывает только имя типа класса или имя типа интерфейса, вы можете запускать его где угодно, пока вашкурсор находится внутри определения класса или интерфейса.Он будет захватывать имя области действия класса / интерфейса.

Он запускает вызов буфера обмена в потоке, потому что это компонент Windows Forms, и они должны работать в STAThread.

Копируетполное имя в буфере обмена.

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics

Public Module SkurmedelMacros

    Public Sub SetClipboard(ByVal x As Object)
        System.Windows.Forms.Clipboard.SetText(CStr(x), System.Windows.Forms.TextDataFormat.Text)
    End Sub

    Public Sub GetTypeName()
        Dim solution As Solution = DTE.Solution
        Dim activePoint As TextPoint = CType(DTE.ActiveDocument.Selection, TextSelection).ActivePoint
        Dim codeElem As CodeElement = _
            DTE.ActiveDocument.ProjectItem.FileCodeModel.CodeElementFromPoint(activePoint, vsCMElement.vsCMElementClass)
        If codeElem Is Nothing Then
            codeElem = DTE.ActiveDocument.ProjectItem.FileCodeModel.CodeElementFromPoint(activePoint, vsCMElement.vsCMElementInterface)
        End If

        Dim ClipBoardThread As System.Threading.Thread = New System.Threading.Thread(AddressOf SetClipboard)
        With ClipBoardThread
            .ApartmentState = System.Threading.ApartmentState.STA
            .IsBackground = True
            .Start(codeElem.FullName)
            .Join()
        End With
        ClipBoardThread = Nothing

    End Sub


End Module
...