为了生成代码,需要使用CodeDOM对象,这些对象看起来相当复杂且编码繁琐。此外,如果代码生成的“源”文件是某种文本格式,那么就需要执行大量的字符串解析,以提取生成适当代码所需的“参数”。
另一个问题是,每次想要生成其他东西时,都需要创建另一个自定义工具并在Visual Studio中注册它。这可能会导致自定义工具的“DLL地狱”,并且记住每个工具的名称也会变得困难。
XML消除了所有这些艰难的字符串解析工作,并提供了一个强大的机制(XPath)来提取XML文件中的任何想要的内容。XSLT提供了一个灵活的机制来生成任何格式的输出。因此,将自定义工具代码调整为运行XSL转换,而不是生成代码。
通过这种方式,每次想要创建一个新的代码生成器,只需要发明一个新的XML模式用于源文件,以及一个相应的XSL转换来生成所需的代码。
为了让TransformCodeGenerator正常工作,有两个要求:
XML源文件的根元素必须包含一个名为"transformer"的属性。这个属性的值指定了用于转换的XSLT文件。
XSLT文件名可以是完全限定的,或者只是文件名,在这种情况下,文件必须位于与XML文件相同的目录中(在项目中),或者与TransformCodeGenerate.dll文件相同的目录中。
将XML文件添加到Visual Studio解决方案中,并将CustomTool属性设置为TransformCodeGenerator。每次修改并保存XML文件时,自定义工具都会重新生成代码。
创建了两个示例XML文件来说明这个自定义工具的可能用法。
发明了一个XML模式,描述了一个带有一些控件的WinForms表单。查看测试项目中的"MyXMLForm.xml"文件。相应的XSLT转换,"MakeXMLFormCode.xslt",将这个转换为创建一个类,该类为每个控件有字段,为每个控件创建一个新实例,设置控件属性,并将它们添加到表单中。
第二个示例是“类型安全”的DataTable。这个XML文件以比XSD文件更友好的方式描述了一个数据库表。这次,XSLT生成了两个类,分别继承自DataTable和DataRow。DataRow类将为DataTable包含的每个列具有类型安全的属性。可以进一步扩展这个示例,创建一个工具,读取数据库架构并生成这个XML文件... :)
XML + XSLT提供了一种强大的方式生成代码生成代码,现在有了TransformCodeGenerator这个Visual Studio的自定义工具,它比运行外部工具来运行转换要容易得多。