是否应使用Reflection.Emit将属性作为方法发出?

时间:2013-08-12 21:00:52

标签: c# .net reflection clr reflection.emit

我正在使用Reflection.Emit命名空间中的类型来动态生成动态程序集(其中包含动态类型)。

Reflection和Reflection.Emit命名空间都提供了用于处理CLR类型的方法和属性的API。

据我所知,属性是由C#编译器实现的方法,所以我想知道在动态发布它们时应该如何处理它们?

是否应使用MethodBuilder或使用PropertyBuilder发布属性? (即:致电DefineMethodDefineProperty?)

对于另一种方法,是否有任何建议?

1 个答案:

答案 0 :(得分:4)

  

是否应使用MethodBuilder或使用PropertyBuilder

发出属性

两者。如果你有一个读写属性X,那么在CIL中它表示为一个get方法(通常称为get_X),一个set方法(通常称为set_X)和一个正确调用的{ {1}}指向两种方法。

因此,要使用Reflection.Emit创建属性,您应该:

  1. 使用X创建get方法(可能从某个字段读取)。
  2. 使用另一个MethodBuilder创建set方法(可能写入相同的字段)。
  3. 使用MethodBuilder创建媒体资源,设置PropertyBuilder并呼叫NameSetGetMethod()
  4. 如果您想创建一个只读属性,只需跳过第2步,不要致电SetSetMethod()