2

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

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

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

应该使用 aMethodBuilder还是使用 a发出属性PropertyBuilder?(即:通过调用DefineMethodDefineProperty?)

有没有一种方法优于另一种方法的建议?

4

1 回答 1

4

MethodBuilder应该使用 a还是使用 a来发出属性PropertyBuilder

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

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

  1. 用于MethodBuilder创建 get 方法(可能从某个字段读取)。
  2. 使用另一个MethodBuilder来创建 set 方法(可能写入相同的字段)。
  3. 用于PropertyBuilder创建属性、设置其Name和调用SetGetMethod()and SetSetMethod()

如果要创建只读属性,只需跳过第 2 步,不要调用GetSetMethod().

于 2013-08-12T23:05:30.810 回答