我正在使用Reflection.Emit
命名空间中的类型来动态生成动态程序集(其中包含动态类型)。
Reflection和Reflection.Emit
命名空间都提供了用于处理CLR类型的方法和属性的API。
据我所知,属性是由C#编译器实现的方法,所以我想知道在动态发布它们时应该如何处理它们?
是否应使用MethodBuilder
或使用PropertyBuilder
发布属性? (即:致电DefineMethod
或DefineProperty
?)
对于另一种方法,是否有任何建议?
答案 0 :(得分:4)
是否应使用
发出属性MethodBuilder
或使用PropertyBuilder
?
两者。如果你有一个读写属性X
,那么在CIL中它表示为一个get方法(通常称为get_X
),一个set方法(通常称为set_X
)和一个正确调用的{ {1}}指向两种方法。
因此,要使用Reflection.Emit创建属性,您应该:
X
创建get方法(可能从某个字段读取)。MethodBuilder
创建set方法(可能写入相同的字段)。MethodBuilder
创建媒体资源,设置PropertyBuilder
并呼叫Name
和SetGetMethod()
。如果您想创建一个只读属性,只需跳过第2步,不要致电SetSetMethod()
。