我有一些脚本作为构建过程的一部分运行,它查看各种源代码文件并为我生成更多源代码。
脚本使用CodeDom生成它们,并使用简单的文本阅读器读取.cs
文件。
其中一个脚本正在寻找使用名为PageMenuItem
的特定类属性,其目的是构建页面菜单项的静态列表。
它现在通过读取所有.cs
文件并查找"PageMenuItem"
属性来执行此操作,然后计算参数的数量并尝试找出正在使用的构造函数,以便它可以拉除了各种信息之外。
PageMenuItem
有7个带有各种参数的构造函数,因此很难从.cs
源代码中确定正在使用哪个构造函数,因此如何解析信息。
我不想尝试自己解析文本,而是想在内存中构造一个PageMenuItem
对象,然后使用它的属性。
所以,我需要一种从.cs
文件中获取属性声明并从中构建PageMenuItem
的新实例的方法。
这可能吗?
提出这个问题的另一种方式:
鉴于此字符串:
string myCodeStatement = "[MyAttribute(\"asdf\", \"foo\")]";
如何创建MyAttribute
类型的对象,以便我可以使用该对象?我完全可以访问定义MyAttribute
的源代码。
答案 0 :(得分:1)
好像你可以内省类文件,或者在构造函数中添加一个注释,使你的解析工作更简单。面向方面的技术可能有所帮助 - 每次调用构造函数时都会捕获,并且实际上,将项添加到列表中。
答案 1 :(得分:1)
您可以使用CSharpCodeProvider执行此操作。有一个Microsoft Support article描述了这个过程。
答案 2 :(得分:1)
调用编译器是一个选项吗?您可以自己构建源文件并使用反射来遍历属性,或者您可以创建使用这些属性标记的虚拟源文件。无论哪种方式,一旦编译完成,您就可以反思以访问属性的属性。
答案 3 :(得分:1)
此脚本是构建过程的一部分,因此需要非常快。此外,它生成将要编译的源代码,所以我想避免“双重编译”我的项目。
我也不想编译和加载一个程序集只是为了反映它,这在我的构建过程中做几百次似乎“很贵”。
我决定我现在需要解决如何解析属性的问题。 ---
我已经在阅读源代码并尝试计算属性数量。我决定修改该代码只是将参数解析为其类型,然后使用我的解析参数使用Activator.CreateInstance()
。 Activator将找出要使用的构造函数,我将获得属性类的实例并可以使用其属性。
我已经知道属性的构造函数中有哪些类型可用,所以我编写了一个小方法,将parans之间的东西解析为正确的类型(string,int,guid等),然后我将该对象数组传递给活化剂。
Activator努力找到正确的构造函数,并给我一个属性类的实例。