向IntelliSense提供不应修改部分类的提示

时间:2016-02-25 14:08:59

标签: c# code-generation intellisense

最近我使用了相当多的代码生成,通常与部分类结合使用。基本上设置如下:

  • 包含生成代码的部分类。其中一些代码将调用部分方法。代码重新生成了很多时间。代码生成器在某些情况下是自定义工具。
  • 部分方法在单独的文件中手动实现。

问题在于,当我使用“生成方法”等智能感知功能时,由于某种原因,它们会在包含生成代码的文件中生成。显然我不希望这样。

我的问题是:是否有可能生成一些提示,告诉Intellisense它不应该触摸某些'cs'文件(而是其他部分类)?

更新

回想起来,我应该注意到我正在使用自定义工具来生成代码。它不是EF或简单的转换;代码生成中涉及到相当多的逻辑。此外,它还使用部分类生成完整的命名空间和类结构。通过从csproj文件中提取“root命名空间”,然后使用文件夹结构来确定绝对命名空间(它与Linq2sql的工作方式类似),可以找到它。

xanatos建议的答案(谢谢!)有效:intellisense对名称进行排序操作,然后按字母顺序对名称进行排序,然后选择列表中的第一项。这意味着您可以生成一个zzzz.foo.cs(虽然有点难看)可以正常工作。我刚刚进行了一些实验,发现功能find all references返回VS似乎使用的顺序。事实证明,它的工作原理如下:

假设您有一个适用于文件名foo.bar的自定义工具,并将其转换为foo.cs。自定义工具将生成内容作为字符串并将其传递回Visual studio(这就是自定义工具的工作方式......)。结果将位于名为foo.cs的文件中。

现在,我很惊讶地发现Intellisense 将其排序为foo.cs而是foo.bar\foo.cs。换句话说:无论您如何命名自定义工具中的“cs”输出,都必须将基本文件foo.bar重命名为zoo.bar

虽然这可能是一种解决方法,但我很愿意接受它作为答案,因为我必须在项目中给出奇怪名称的文件(名称有意义......)。此外,我的一些自定义工具依赖于他们的文件名,因此也会被破坏......

因此,我仍然愿意就如何正确解决这个问题提出建议。

2 个答案:

答案 0 :(得分:3)

从我在VS2013中完成的一个简单测试中,似乎Visual Studio 2013将该方法添加到"第一个"他在Solution Explorer中找到的文件。因此,您只需在文件名中添加.something.cs,例如MyClass.generated.cs vs MyClass.cs。请注意,VS2013似乎正在使用"完整路径",基于名称的路径排序。所以:

  

ž\ MyClass.cs

之后

  

MyClass.generated.cs

即使在解决方案资源管理器中,所有文件夹都是先订购的,

(智能感知会将代码放入MyClass.generated.cs)。

完整示例:

  

A \ MyClass.gen3.cs

     

MyClass.gen2.cs

     

ž\ MyClass.gen1.cs

这应该是"看到"通过Intellisense,它将把新类放在A\MyClass.gen3.cs

答案 1 :(得分:2)

假设您正在谈论EF,我总是更改模板文件(.tt),因此自动生成的文件的文件名是[classname] .model.cs。这意味着我的部分文件,按惯例称为[classname] .cs按字母顺序排在第一位,似乎总是被选中进行自动生成。

您所要做的就是找到/替换所有:

fileManager.StartNewFile(entity.Name + ".cs");

使用:

fileManager.StartNewFile(entity.Name + ".model.cs");

应该有3个。

这有其他好处,如自动生成的文件在文件名中清楚标记。

我仍然不知道他们为什么不首先做这件事。

如果您不是在谈论EF,那么使用文件名来命令它们的相同技巧应该有效。