Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Visual Studio中在当前文档中生成代码?_C#_Visual Studio_Unity3d - Fatal编程技术网

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

C# 如何在Visual Studio中在当前文档中生成代码?,c#,visual-studio,unity3d,C#,Visual Studio,Unity3d,我很抱歉,如果这是一个很容易搜索的东西,但我真的不确定正确的搜索词是什么 我现在正在使用VisualStudio,主要用于Unity开发。创建新脚本时,我经常声明一些私有成员变量,如下所示: private Rigidbody _rigidbody; private SomeOtherComponent _myComponent; void Start(){ _rigidbody = GetComponent<Rigidbody>(); _myComponent =

我很抱歉,如果这是一个很容易搜索的东西,但我真的不确定正确的搜索词是什么

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

private Rigidbody _rigidbody;
private SomeOtherComponent _myComponent;
void Start(){
    _rigidbody = GetComponent<Rigidbody>();
    _myComponent = GetComponent<SomeOtherComponent>();
}
为了初始化这些变量,我需要在名为“Start”的函数中添加一个GetComponent调用,如下所示:

private Rigidbody _rigidbody;
private SomeOtherComponent _myComponent;
void Start(){
    _rigidbody = GetComponent<Rigidbody>();
    _myComponent = GetComponent<SomeOtherComponent>();
}
然后我可以按一些组合键,它会自动添加

_rigidbody = GetComponent<Rigidbody>();
_rigidbody=GetComponent();
到启动功能

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

您可以尝试我的扩展,它正是为这种轻量级扩展而设计的。它允许将文档编辑为文本或使用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;
}
public类C:VisualCommanderExt.ICommand
{
公共无效运行(EnvDTE80.DTE2 DTE,Microsoft.VisualStudio.Shell.Package)
{
this.DTE=DTE;
EnvDTE.CodeVariable v=FindCurrentVariable();
如果(v!=null)
{
字符串初始化=v.Name+“=GetComponent();”;
AddLine(FindFunction(“Start”)、初始化;
}
}
EnvDTE.CodeFunction FindFunction(字符串名称)
{
EnvDTE.TextSelection ts=DTE.ActiveWindow.Selection作为EnvDTE.TextSelection;
如果(ts==null)
返回null;
EnvDTE.CodeClass CodeClass=ts.ActivePoint.codelement[EnvDTE.vsCMElement.vsCMElementClass]
as EnvDTE.CodeClass;
if(codeClass==null)
返回null;
foreach(codeClass.Members中的EnvDTE.codelement元素)
{
if(elem.Kind==EnvDTE.vsCMElement.vsCMElementFunction&&elem.Name==Name)
返回元素作为EnvDTE.CodeFunction;
}
返回null;
}
EnvDTE.CodeVariable FindCurrentVariable()
{
EnvDTE.TextSelection ts=DTE.ActiveWindow.Selection作为EnvDTE.TextSelection;
如果(ts==null)
返回null;
返回ts.ActivePoint.codelement[EnvDTE.vsCMElement.vsCMElementVariable]
as EnvDTE.code变量;
}
void AddLine(EnvDTE.code函数f,字符串文本)
{
EnvDTE.TextPoint tp=f.GetStartPoint(EnvDTE.vsCMPart.vsCMPartBody);
EnvDTE.EditPoint p=tp.CreateEditPoint();
p、 插入(text+System.Environment.NewLine);
p、 智能格式(tp);
}
EnvDTE80.DTE2-DTE;
}

ReSharper有这个功能,但它不是免费的。还有。为什么不为声明和初始化编写一个代码段呢?当然,代码段可以让我更快地键入GetComponent行,但它们也只能完成一半。我仍然需要声明我的成员变量,然后转到Start函数,然后键入我的代码段。我正试图跳过这一步。您可以查看Roslyn分析器和代码修复()。Analyzer允许您检测要初始化的私有字段,并向开发人员弹出提示。由提示符调用的代码修复程序可以生成初始化代码,尽管它有自己的学习曲线,需要一些努力。如果你对这个方向感兴趣,请告诉我,我会详细说明它的答案。很好的扩展!我希望没有人介意你在这里提到它,因为它看起来真的很有用。现在尝试一下。。。