属性是否应使用Reflection.Emit作为方法发射

本文关键字:方法 发射 Emit Reflection 是否 属性 | 更新日期: 2023-09-27 18:27:35

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

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

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

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

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

属性是否应使用Reflection.Emit作为方法发射

应该使用MethodBuilder还是使用PropertyBuilder来发射属性?

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

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

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

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