为通过反射找到的属性重新生成C#代码的简便方法?

时间:2013-03-13 13:25:24

标签: .net reflection code-generation

我正在创建一个程序,它使用反射来检查程序集中的枚举类型,在某些情况下,重写定义这些枚举的C#源文件。

有问题的源文件是一种狭义规定的格式,它基本上只定义枚举,可能在部分类中,因此创建一个简单的生成器并不太难。

不幸的是,当enum上有自定义属性时,情况会有点复杂,在这个应用程序中通常会有。

我可以使用反射来获取Attribute或CustomAttributeData对象的列表。现在我正在使用一种特殊的方法来假设有关特定属性的事情并在此基础上为它们生成C#代码,但我更倾向于采用更通用的方法。

给定一个属性,如果可以安全地假设该属性没有参数,我可以确定类型和平凡的输出代码,如下所示:

[SomeNamespace.SomeAttribute]

不幸的是,假设不存在任何参数是不安全的,如果存在任何参数,则生成所需的代码并不那么简单。

在一般情况下,是否有一些现有的机制可以在.NET或其他地方为一个属性生成C#代码,给定一个我们要复制的属性调用?我检查了Attribute和CustomAttributeData类,但它们中的任何内容似乎都没有自动处理。

1 个答案:

答案 0 :(得分:1)

您可以使用Type.GetCustomAttributesData。而不是为您提供构造的Attribute实例,这将为您提供一个CustomAttributesData对象,可以单独访问构造函数,构造函数参数和命名参数,您需要将该属性作为源代码重现。