生成的C#代码是否有#pragma或类似指令将模板代码行号与C#行号匹配?

ang*_*son 8 c# code-generation pragma line-numbers

我有一个看起来类似于旧式ASP代码的模板系统.我通过一个类来运行它,该类将整个事物重写为C#源代码,编译并最终执行它.

我想知道的是,如果有某种类似#pragma的指令,我可以将生成的C#代码撒上,这会使编译错误与我的模板文件中的行号相匹配?

例如,假设我的模板代码中有第一行也是唯一一行:

Object o = datta; // should be data, compiler error
Run Code Online (Sandbox Code Playgroud)

但是为了编译它,我必须添加一个命名空间,一个类,一个方法和一些样板代码,所以上面的这一行,我的模板文件中的第一行,实际上最终是#17行(C#代码中的随机数,仅用于说明目的).编译器错误自然会将我的错误标记为第17行,而不是第1行.

我记得我之前使用的另一种编程语言(虽然我记不起哪一种)它有一个我可以添加的指令,这会使错误行号排成一行.

在C#3.5中有没有这样的东西?

Sam*_*ell 16

您有#line预处理器指令.

#line 允许您修改编译器的行号和(可选)文件名输出以查找错误和警告.

#line directive可能在构建过程的自动化,中间步骤中使用.例如,如果从原始源代码文件中删除了行,但您仍希望编译器根据文件中的原始行编号生成输出,则可以删除行,然后使用模拟原始行编号#line.

#line hidden指令隐藏了调试器的连续行,这样当开发人员逐步执行代码时,a #line hidden和下一个#line指令之间的任何行(假设它不是另一个#line隐藏指令)都将被逐步执行.此选项还可用于允许ASP.NET区分用户定义的代码和机器生成的代码.尽管ASP.NET是此功能的主要使用者,但更多源生成器可能会使用它.

一个#line hidden指令不影响错误报告的文件名或行号.也就是说,如果在隐藏块中遇到错误,编译器将报告错误的当前文件名和行号.

#line filename指令指定要在编译器输出中显示的文件名.默认情况下,使用源代码文件的实际名称.文件名必须是双引号(""),并且必须以行号开头.