我正在思考程序集并收集类型和成员的自定义属性。但是,我需要读取那些属性声明“,因为它们出现在代码中”(或者在对象浏览器中浏览程序集时编译的程序集)。
因此,如果程序集具有类型声明:
[Serializable]
[Author("John Doe", version=1.1)]
class C {}
当我反思类型C
并使用typeof(C).GetCustomAttributes()
获取其属性时,它只是给我object[]
包含这些属性类型的“实例”。但我需要它们,就像它们出现在代码中一样:<ConstructorRef, Arguments>
<Serializable(), []>
<Author(string,int), ["John Doe", 1.1]>
有没有办法从“属性实例”返回到“属性声明”?因为可能有许多属性类型的构造函数,并且属性可能根本不会公开任何可以与构造函数匹配的属性。这似乎不是一种选择。
Bonus问题: IDE中的对象/汇编浏览器(例如VS)如何看到传递给属性构造函数的常量参数?是通过反汇编还是反思?如果它只能用于反汇编,我想我在这里运气不好。
我需要这个来反映程序集并从中生成代码。所以我需要模仿类型和成员的自定义属性,但到目前为止我一无所知。任何帮助表示赞赏。
答案 0 :(得分:2)
是的,请看CustomAttributeData
。顺便说一下,如果只加载一个反射组件(它没有实例化属性),它是访问自定义属性的唯一方法。我很确定反射API可以解析除IL代码之外的程序集中的每个信息,IL代码只作为字节数组公开。但是,如果你碰壁,例如Mono Cecil。