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

C# 向IntelliSense提供不应修改分部类的提示,c#,code-generation,intellisense,C#,Code Generation,Intellisense,最近我使用了相当多的代码生成,通常与部分类结合使用。基本上,设置如下所示: 包含生成代码的分部类。其中一些代码将调用分部方法。代码被重新生成了很多时间。代码生成器在某些情况下是一个自定义工具 分部方法在单独的文件中手动实现 问题是,当我使用像“generate method”这样的Intellisense功能时,出于某种原因,它们是在包含生成代码的文件中生成的。显然我不想那样 我的问题是:是否有可能生成一些提示,告诉Intellisense它不应该接触某些“cs”文件(而是其他部分类) 更

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

  • 包含生成代码的分部类。其中一些代码将调用分部方法。代码被重新生成了很多时间。代码生成器在某些情况下是一个自定义工具
  • 分部方法在单独的文件中手动实现
问题是,当我使用像“generate method”这样的Intellisense功能时,出于某种原因,它们是在包含生成代码的文件中生成的。显然我不想那样

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


更新

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

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

假设您有一个自定义工具,可以处理文件名
foo.bar
,并将其转换为
foo.cs
。自定义工具将以字符串形式生成内容并将其传递回Visual studio(自定义工具就是这样工作的…)。结果将出现在名为
foo.cs
的文件中

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

虽然这可能是一个解决办法,但我不愿意接受它作为答案,因为在我的项目中,我必须给文件起奇怪的名字(名字有意思…)。另外,我的一些自定义工具依赖于它们的文件名,因此也会被破坏


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

假设您讨论的是EF,我总是更改模板文件(.tt),使自动生成的文件名为[classname].model.cs。这意味着我的部分文件,按惯例称为[classname].cs是按字母顺序排列的第一个文件,似乎总是被自动生成

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

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

应该有3个

这还有其他好处,比如自动生成的文件在文件名中有明确的标记

我还是不知道他们为什么不这么做


如果您不是在谈论EF,那么使用文件名对其进行排序的相同技巧应该也能奏效。

从我在VS2013中完成的一个简单测试来看,Visual Studio 2013似乎将该方法添加到了他在解决方案资源管理器中找到的“第一个”文件中。因此,您可以简单地在文件名中添加
.something.cs
,比如
MyClass.generated.cs
vs
MyClass.cs
。请注意,VS2013似乎使用了“完整路径”,路径顺序基于名称。因此:

Z\MyClass.cs

紧随其后

MyClass.generated.cs

(Intellisense将把代码放入
MyClass.generated.cs
),即使在解决方案资源管理器中,所有文件夹都是先排序的

完整示例:

A\MyClass.gen3.cs

MyClass.gen2.cs

Z\MyClass.gen1.cs


这应该是Intellisense“看到”的顺序,因此它将把新类放在
A\MyClass.gen3.cs

中,所以基本上您要说的是它使用完整路径。。。。我已经害怕了:我的一些生成器(f.ex.my lexer/parser code generator)在一个生成的文件中生成完整的(子命名空间)类层次结构。基本上,这意味着无论我如何命名它,它都会在错误的文件中生成代码。@atlaste始终存在
z.z.z.zenrated.cs
文件:-)是的,我也考虑过-问题是,如果将当前文件夹“置于”子文件夹之上,则该解决方案不起作用。不过我得试试。@atlaste然后把它放在z\z.z.z.zenRated.cs文件夹中:-)xanatos,是的,这对自定义工具来说确实很棘手;您只需返回字符串,VS就会为您生成文件。另外,手动将其放入子文件夹是很棘手的,因为我根据相对于csproj文件的文件夹确定名称空间。我当然可以两者兼而有之,但我不想这样。从您的“完整示例”来看,z.z解决方案可能可行,但这意味着在启动自定义工具之前重命名文件。
fileManager.StartNewFile(entity.Name + ".model.cs");