在 Visual Studio 加载项中 - 如何检索文本选择对象的属性 (Visual Commander)

2024-01-08

我为此绞尽脑汁了一天多:

本质上,我正在尝试构建一个用于 Visual Studio 2012 的加载项,该加载项执行以下操作:

获取当前选择的变量名称,找到它作为实例的类,然后在其自己的行中为每个属性键入 veriable.property:

BEFORE:

例如。 (考虑选择了myPerson)

int CountPerson(Person myPerson)
{
    *myPerson*
}

AFTER:

int CountPerson(Person myPerson)
{
    myPerson.Name
    myPerson.Surname
    myPerson.Age
}

我在 stackoverflow 上问了类似的问题,并得到了我现在正在追求的答案。Visual Studio 将类的所有属性转储到编辑器中 https://stackoverflow.com/questions/25590751/visual-studio-dump-all-properties-of-class-into-editor

这是到目前为止的源代码:

using EnvDTE;
using EnvDTE80;
using System;
using System.ComponentModel;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;


public class C : VisualCommanderExt.ICommand
{
    public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package) 
    {
        EnvDTE.TextSelection ts = DTE.ActiveWindow.Selection as EnvDTE.TextSelection;
        if (ts == null)
            return;

        EnvDTE.CodeClass codeClass = ts.ActivePoint.CodeElement[vsCMElement.vsCMElementClass]   as     EnvDTE.CodeClass;
        if (codeClass == null)
            return;

        string properties = "";
        foreach (CodeElement elem in codeClass.Members)
        {
            if (elem.Kind == vsCMElement.vsCMElementProperty)
                properties += elem.Name + System.Environment.NewLine;
        }
        ts.Text = properties;   

    }
}

这工作得很好,除了它完全忽略所选文本,而是打印当前类的属性。我需要我选择的变量的类的属性。

如果输入“Person”而不是“|myPerson”会让事情变得更容易,我会接受。

我在互联网上找到了以下链接,但无法实现该逻辑:http://blogs.clariusconsulting.net/kzu/how-to-get-a-system-type-from-an-envdte-codetyperef-or-envdte-codeclass/ http://blogs.clariusconsulting.net/kzu/how-to-get-a-system-type-from-an-envdte-codetyperef-or-envdte-codeclass/ http://www.visualstudioextensibility.com/2008/03/06/how-do-i-get-a-system-type-from-a-type-name/ http://www.visualstudioextensibility.com/2008/03/06/how-do-i-get-a-system-type-from-a-type-name/

他们可以帮助你帮助我吗?


您可以将光标设置在函数定义行中的函数参数名称上,并使用以下代码生成属性列表:

(添加对 Microsoft.VisualStudio.Shell.Design 的引用)

public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package) 
{
    EnvDTE.TextSelection ts = DTE.ActiveWindow.Selection as EnvDTE.TextSelection;
    if (ts == null)
        return;

    EnvDTE.CodeParameter codeParam = ts.ActivePoint.CodeElement[vsCMElement.vsCMElementParameter] as EnvDTE.CodeParameter;
    if (codeParam == null)
        return;

    System.Type tClass = GetTypeByName(DTE, package, codeParam.Type.AsFullName);
    string properties = "";
    foreach (var p in tClass.GetProperties())
    {
            properties += codeParam.Name + "." + p.Name + System.Environment.NewLine;
    }
    System.Windows.Clipboard.SetText(properties);
    System.Windows.MessageBox.Show(properties);
}

private System.Type GetTypeByName(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package, string name)
{
    System.IServiceProvider serviceProvider = package as System.IServiceProvider;
    Microsoft.VisualStudio.Shell.Design.DynamicTypeService typeService = 
        serviceProvider.GetService(typeof(Microsoft.VisualStudio.Shell.Design.DynamicTypeService)) as
        Microsoft.VisualStudio.Shell.Design.DynamicTypeService;

    Microsoft.VisualStudio.Shell.Interop.IVsSolution sln = 
        serviceProvider.GetService(typeof(Microsoft.VisualStudio.Shell.Interop.IVsSolution)) as
        Microsoft.VisualStudio.Shell.Interop.IVsSolution;

    Microsoft.VisualStudio.Shell.Interop.IVsHierarchy hier;
    sln.GetProjectOfUniqueName(DTE.ActiveDocument.ProjectItem.ContainingProject.UniqueName, out hier);

    return typeService.GetTypeResolutionService(hier).GetType(name, true);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Visual Studio 加载项中 - 如何检索文本选择对象的属性 (Visual Commander) 的相关文章

随机推荐

  • SQL Server 2008 R2:从视图中包含的表中删除重复行

    创建表dup1 CREATE TABLE dup1 cola VARCHAR 10 colb VARCHAR 10 插入记录 INSERT INTO dup1 VALUES 1 2 INSERT INTO dup1 VALUES 1 2 I
  • Delphi XE2:禁用组件上的 vcl 样式

    我正在尝试按照有关禁用表单上控件上的颜色的示例进行操作 TStyleManager Engine RegisterStyleHook ClrMeans TwwDBComboDLG TEditStyleHook 但在注册或取消注册第 3 方控
  • C++ find 返回字符串变量 text 中的最后一个单词。字符串 getFirstWord(文本)

    我试图转到字符串的末尾 返回直到最后一个空格 然后前进直到单词的末尾并将该单词存储在空字符串中 不允许使用数组或指针 string getLastWord string text string lastword int last text
  • 检测重叠周期的算法[重复]

    这个问题在这里已经有答案了 我必须检测两个时间段是否重叠 每个期间都有开始日期和结束日期 我需要检测我的第一个时间段 A 是否与另一个时间段 B C 重叠 就我而言 如果 B 的开头等于 A 的结尾 则它们不重叠 反之亦然 我发现了以下案例
  • 对话框内的引导箱对话框

    我最近被分配到一个使用 bootbox 的项目 我当前的问题之一是在打开一个对话框后打开另一个对话框 问题是打开第二个对话框后背景阴影不会覆盖第一个对话框 有没有办法打开第二个对话框覆盖第一个对话框 EDIT function Confir
  • 有浮动工具提示的 Flot 示例吗?

    我目前正在研究一个Flot http code google com p flot 图形 即API http flot googlecode com svn trunk API txt尽管高级使用的示例没有得到广泛记录 但总体而言似乎非常强
  • 如何将图像放入 AlertDialog 中?安卓

    我不知道如何将图像放入 AlertDialog 中 我有这段代码 但我认为这是不可能的 AlertDialog Builder alert new AlertDialog Builder MessageDemo this ImageView
  • 为新用户授予默认权限或默认组

    默认行为似乎是新用户没有权限 也没有组 然而 我不想手动授予每个新用户基本权限 并且我假设他们不想等我这样做 我应该如何为新用户分配默认权限 已经提出了一些类似的问题 但对于一般情况没有明确的答案 Django默认用户权限 https st
  • @layout 引用的自定义 xml 属性

    我想用自己的 xml 属性创建一个自定义视图 我想指定一个标题布局 该布局将在我的自定义 xml 视图中膨胀 如下所示
  • plotly 3d 表面 - 将立方体更改为矩形空间

    我想要一个不在立方体中的 3D 图 因为我的 z 数据比 x 和 y 轴的比例小 10 倍 如何设置才能使 3D 绘图不是立方体 而是矩形 我希望 x y z 轴也具有相同的比例 也就是说 在此示例中 x 和 y 的范围是从 0 到 100
  • 如何以编程方式获取 aws ebs 定价?

    是否可以以编程方式下载 aws ebs 定价 我能够下载整个 AWS 服务索引文件 但没有看到列出的 Amazon EBS 我下载了 AmazonEC2 定价信息 它有 PricePerUnit 对于 EC2 实例来说意味着 但没有专门显示
  • pickle pandas DataFrame 的最快方法是什么?

    使用 Pandas 内置方法或pickle dump 标准的pickle方法如下所示 pickle dump my dataframe open test pickle p wb Pandas 内置方法如下所示 my dataframe t
  • 如何修改预构建的 Python 安装以在另一个目录中工作?

    对于预构建的自定义 Python 发行版的项目 我需要能够使用以下命令从源代码编译包pip 在已安装的环境中 最终产品的两次安装的文件系统结构可能如下所示 opt my program v1 some files custom python
  • Perl 程序用空格替换制表符

    我想编写一个 Perl 单行代码 用空格替换当前目录中一批文本文件中的所有制表符 t 而不影响可见间距 谁能告诉我如何做到这一点 这是在FAQ http perldoc perl org perlfaq4 html How do I exp
  • 是否可以创建动态嵌入功能?

    是否可以在ActionScript3中创建动态嵌入功能 例如像这样 public function embedImage path String Bitmap Embed source path mimeType image png var
  • .NET 相当于旧的 vb left(string, length) 函数

    作为一名非 NET 程序员 我正在寻找旧 Visual Basic 函数的 NET 等效项left string length 它很懒 因为它适用于任何长度的字符串 正如预期的那样 left foobar 3 foo 同时 最有帮助的是 l
  • 创建一个大的位域?

    我想在 JavaScript 中创建一个大的位字段 它将有效地表示多维标记数组 使用索引跳转到物理 1D 结构中的各个维度 我正在考虑如何将字符串用作位 而不是一堆数字 这样我就可以首先分配适当长度的字符串 数据类型 Unicode 和转换
  • 在地图上显示用户位置 SwiftUI

    我正在尝试加载地图并在用户位置上显示初始位置 并使用 SwiftUI 在地图上显示用户的位置 我不知道如何在 SwiftUI 中做到这一点 我尝试将 view showsUserLocation true 放入 updateUIView 函
  • TypedValue 转换为字符串

    当我使用 Android 应用程序时 LogCat 中随机出现了数十次重复的以下 5 行内容 10 26 12 53 30 372 21270 21270 W Resources Converting to string TypedValu
  • 在 Visual Studio 加载项中 - 如何检索文本选择对象的属性 (Visual Commander)

    我为此绞尽脑汁了一天多 本质上 我正在尝试构建一个用于 Visual Studio 2012 的加载项 该加载项执行以下操作 获取当前选择的变量名称 找到它作为实例的类 然后在其自己的行中为每个属性键入 veriable property