gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:10:29 24 4
gpt4 key购买 nike

我在这个问题上摸索了一天多:

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

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

之前:

例如。 (考虑选择 myPerson)

int CountPerson(Person myPerson)
{
*myPerson*
}

之后:

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

我在 stackoverflow 上问过一个类似的问题,并得到了我现在追求的答案。 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://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);
}

关于c# - 在 Visual Studio 加载项中 - 如何检索文本选择对象的属性 (Visual Commander),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25724189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com