0

背景

我有一些脚本作为构建过程的一部分运行,它们查看各种源代码文件并为我生成更多源代码。

脚本使用 CodeDom 生成它们,它们.cs使用简单的文本阅读器读取文件。

问题

其中一个脚本正在寻找一个名为的特定类属性的使用PageMenuItem,其目的是构建页面菜单项的静态列表。

它现在通过读取所有.cs文件并查找"PageMenuItem"属性来执行此操作,然后计算参数的数量并尝试找出正在使用的构造函数,以便它可以分解各种信息。

有 7 个PageMenuItem不同参数的构造函数,因此很难从.cs源代码中确定正在使用哪个构造函数以及如何解析信息。

我不想自己解析文本,而是想简单地PageMenuItem在内存中构造一个对象,然后使用它的属性。

所以,我需要一种从.cs文件中获取属性声明并从中构造一个新实例的方法PageMenuItem

那可能吗?


问这个问题的另一种方式:

给定这个字符串:

string myCodeStatement = "[MyAttribute(\"asdf\", \"foo\")]";

如何创建该类型的对象MyAttribute以便我可以使用该对象?我可以完全访问定义MyAttribute.

4

4 回答 4

1

似乎您可以自省类文件,或者向构造函数添加注释,这将使您的解析工作更简单。面向方面的技术可能会有所帮助——每次调用构造函数时都会捕获它,并按原样将项目添加到您的列表中。

于 2009-11-30T22:42:40.867 回答
1

您可以使用CSharpCodeProvider来执行此操作。有一篇Microsoft 支持文章描述了该过程。

于 2009-11-30T22:42:54.360 回答
1

调用编译器是一种选择吗?您可以自己构建源文件并使用反射来遍历属性,或者您可以创建一个用这些属性标记的虚拟源文件。无论哪种方式,一旦编译完成,您就可以通过反射来访问属性的属性。

于 2009-11-30T22:44:53.373 回答
1

这个脚本是构建过程的一部分,所以它需要非常快。此外,它会生成要编译的源代码,所以我想避免“双重编译”我的项目。

我也不想为了反映它而编译和加载程序集,这在我的构建过程中执行数百次似乎“昂贵”。

我决定只需要修复我现在解析属性的方式。---

我已经在阅读源代码并尝试计算属性的数量。我决定我可以修改该代码以将参数解析为它们的类型,然后使用Activator.CreateInstance()我解析的参数。Activator 将找出要使用的构造函数,我将获得我的属性类的实例并可以使用它的属性。

我已经知道属性的构造函数中有哪些类型可用,因此我编写了一个小方法,将参数之间的内容解析为正确的类型(字符串、int、guid 等),然后将该对象数组传递给 Activator。

Activator 努力寻找正确的构造函数并返回我的属性类的一个实例。

于 2009-12-01T00:14:12.350 回答