WEB开发网
开发学院软件开发C语言 C#模板编程(2): 编写C#预处理器,让模板来的再自然... 阅读

C#模板编程(2): 编写C#预处理器,让模板来的再自然一点

 2010-09-30 22:42:25 来源:WEB开发网   
核心提示: 编译之后,放在系统路径下(或放入任一在系统路径下的目录),C#模板编程(2): 编写C#预处理器,让模板来的再自然一点(2),然后,在VS的项目属性的Build Events的Pre-build event command line中写入“Csmacro.exe $(ProjectD

编译之后,放在系统路径下(或放入任一在系统路径下的目录)。然后,在VS的项目属性的Build Events的Pre-build event command line中写入“Csmacro.exe $(ProjectDir)”,即可在编译项目之前,对$(ProjectDir)目录下的所有cs程序进行预处理。

Csmacro.exe 对于包含#region include <path> #endregion代码的程序xx.cs,预处理生成名为 xx_Csmacro.cs的文件;对于文件名以"Csmacro.cs”结尾的文件,则不进行任何处理。

使用时要注意:

(1)#region include <path> 与 #endregion 之间不能有任何代码;

(2)#region mixin 与 #endgion 之间不能有其它的region

(3)不支持多级引用

三、示例

下面,以《C#模板编程(1):有了泛型,为什么还需要模板?》文尾的例子说明怎样编写C#模板程序:

(1)建立一个模板类 FilterHelper_Template.cs ,编译通过:

FilterHelper_Template.cs

 1 using TPixel = System.Byte; 
 2 using TCache = System.Int32; 
 3 using TKernel = System.Int32; 
 4 
 5 using System; 
 6 using System.Collections.Generic; 
 7 using System.Text; 
 8 
 9 namespace Orc.SmartImage.Hidden 
10 { 
11     static class FilterHelper_Template 
12     { 
13         #region mixin 
14 
15         // 本算法是错误的,只为说明C#模板程序的使用。 
16         public unsafe static UnmanagedImage<TPixel> Filter(this UnmanagedImage<TPixel> src, FilterKernel<TKernel> filter) 
17         { 
18             TKernel* kernel = stackalloc TKernel[filter.Length]; 
19 
20             Int32 srcWidth = src.Width; 
21             Int32 srcHeight = src.Height; 
22             Int32 kWidth = filter.Width; 
23             Int32 kHeight = filter.Height; 
24 
25             TPixel* start = (TPixel*)src.StartIntPtr; 
26             TPixel* lineStart = start; 
27             TPixel* pStart = start; 
28             TPixel* pTemStart = pStart; 
29             TPixel* pT; 
30             TKernel* pK; 
31 
32             for (int c = 0; c < srcWidth; c++) 
33             { 
34                 for (int r = 0; r < srcHeight; r++) 
35                 { 
36                     pTemStart = pStart; 
37                     pK = kernel; 
38 
39                     Int32 val = 0; 
40                     for (int kc = 0; kc < kWidth; kc++) 
41                     { 
42                         pT = pStart; 
43                         for (int kr = 0; kr < kHeight; kr++) 
44                         { 
45                             val += *pK * *pT; 
46                             pT++; 
47                             pK++; 
48                         } 
49 
50                         pStart += srcWidth; 
51                     } 
52 
53                     pStart = pTemStart; 
54                     pStart++; 
55                 } 
56 
57                 lineStart += srcWidth; 
58                 pStart = lineStart; 
59             } 
60             return null; 
61         } 
62         #endregion 
63     } 
64 }
65 
66 

Tags:模板 编程 编写

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接