C#模板编程(2): 编写C#预处理器,让模板来的再自然一点
2010-09-30 22:42:25 来源:WEB开发网编译之后,放在系统路径下(或放入任一在系统路径下的目录)。然后,在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
更多精彩
赞助商链接