是否可以通过阅读源代码来构造对象?

时间:2009-11-30 22:37:39

标签: c# runtime codedom

背景

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

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

问题

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

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

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

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

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

这可能吗?


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

鉴于此字符串:

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

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

4 个答案:

答案 0 :(得分:1)

好像你可以内省类文件,或者在构造函数中添加一个注释,使你的解析工作更简单。面向方面的技术可能有所帮助 - 每次调用构造函数时都会捕获,并且实际上,将项添加到列表中。

答案 1 :(得分:1)

您可以使用CSharpCodeProvider执行此操作。有一个Microsoft Support article描述了这个过程。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

我也不想编译和加载一个程序集只是为了反映它,这在我的构建过程中做几百次似乎“很贵”。

我决定我现在需要解决如何解析属性的问题。 ---

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

我已经知道属性的构造函数中有哪些类型可用,所以我编写了一个小方法,将parans之间的东西解析为正确的类型(string,int,guid等),然后我将该对象数组传递给活化剂。

Activator努力找到正确的构造函数,并给我一个属性类的实例。