【问题标题】:How to generate code in Visual Studio in the current document?如何在当前文档中在 Visual Studio 中生成代码?
【发布时间】:2018-02-01 19:37:33
【问题描述】:

如果这是很容易搜索的内容,我深表歉意,但我不确定正确的搜索词是什么。

我现在正在使用 Visual Studio,主要用于 Unity 开发。在创建新脚本时,我经常声明一些私有成员变量,如下所示:

private Rigidbody _rigidbody;
private SomeOtherComponent _myComponent;

为了初始化这些变量,我需要在一个名为“Start”的函数中添加一个 GetComponent 调用,如下所示:

void Start(){
    _rigidbody = GetComponent<Rigidbody>();
    _myComponent = GetComponent<SomeOtherComponent>();
}

现在,我找到了一个 Visual Studio sn-p 来快速键入“GetComponent”部分,这很好,但我正在寻找一种在 Start 函数中自动生成代码行的方法。在理想的世界里,我可以输入

private Rigidbody _rigidbody;

然后我可以按一些组合键,它会自动添加

_rigidbody = GetComponent<Rigidbody>();

到 Start 函数。

片段只能让我走到一半。我需要做什么来为 Visual Studio 创建这种类型的扩展?这是一件很难完成的事情吗?

【问题讨论】:

  • ReSharper 有这个功能,但它不是免费的。
  • 还有snippets
  • 为什么没有一个 sn-p 用于声明和一个 sn-p 用于初始化?
  • Snippets 让我可以更快地输入 GetComponent 行,当然,但它们也只能让我走到一半。我仍然必须声明我的成员变量,然后进入 Start 函数,然后输入我的 sn-p。我正在尝试跳过这一步。
  • 您可以查看 Roslyn 分析器和代码修复 (github.com/dotnet/roslyn/wiki/…)。 Analyzer 允许您检测要初始化的私有字段并向开发人员弹出提示。提示调用的代码修复可以生成初始化代码,尽管它有其学习曲线并且需要一些努力。如果您对这个方向感兴趣,请告诉我,我会详细说明。

标签: c# visual-studio unity3d


【解决方案1】:

你可以试试我的Visual Commander 扩展,它专为这种轻量级可扩展性而设计。它允许将文档编辑为文本或使用 Visual Studio 代码模型和 Roslyn。

例如,当插入符号位于变量声明中的 _rigidbody 或 _myComponent 上时,调用以下命令:

public class C : VisualCommanderExt.ICommand
{
    public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package)
    {
        this.DTE = DTE;

        EnvDTE.CodeVariable v = FindCurrentVariable();
        if (v != null)
        {
            string initialization = v.Name + " = GetComponent<" + v.Type.CodeType.Name + ">();";
            AddLine(FindFunction("Start"), initialization);
        }
    }

    EnvDTE.CodeFunction FindFunction(string name)
    {
        EnvDTE.TextSelection ts = DTE.ActiveWindow.Selection as EnvDTE.TextSelection;
        if (ts == null)
            return null;
        EnvDTE.CodeClass codeClass = ts.ActivePoint.CodeElement[EnvDTE.vsCMElement.vsCMElementClass]
            as EnvDTE.CodeClass;
        if (codeClass == null)
            return null;
        foreach (EnvDTE.CodeElement elem in codeClass.Members)
        {
            if (elem.Kind == EnvDTE.vsCMElement.vsCMElementFunction && elem.Name == name)
                return elem as EnvDTE.CodeFunction;
        }
        return null;
    }

    EnvDTE.CodeVariable FindCurrentVariable()
    {
        EnvDTE.TextSelection ts = DTE.ActiveWindow.Selection as EnvDTE.TextSelection;
        if (ts == null)
            return null;
        return ts.ActivePoint.CodeElement[EnvDTE.vsCMElement.vsCMElementVariable]
            as EnvDTE.CodeVariable;
    }

    void AddLine(EnvDTE.CodeFunction f, string text)
    {
        EnvDTE.TextPoint tp = f.GetStartPoint(EnvDTE.vsCMPart.vsCMPartBody);
        EnvDTE.EditPoint p = tp.CreateEditPoint();
        p.Insert(text + System.Environment.NewLine);
        p.SmartFormat(tp);
    }

    EnvDTE80.DTE2 DTE;
}

【讨论】:

  • 不错的扩展!我希望没有人介意你在这里提到它,因为它看起来真的很有用。现在试试看……
猜你喜欢
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多