如何在当前文档中的Visual Studio中生成代码?

时间:2018-02-01 19:37:33

标签: c# visual-studio unity3d

如果这是易于搜索的内容,我很抱歉,但我不确定正确的搜索字词是什么。

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

private Rigidbody _rigidbody;
private SomeOtherComponent _myComponent;

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

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

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

private Rigidbody _rigidbody;

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

_rigidbody = GetComponent<Rigidbody>();

到开始功能。

片段只让我到了一半。我需要做什么才能为Visual Studio创建这种类型的扩展?这难以实现吗?

1 个答案:

答案 0 :(得分: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;
}