属性是否应使用Reflection.Emit作为方法发射
本文关键字:方法 发射 Emit Reflection 是否 属性 | 更新日期: 2023-09-27 18:27:35
我使用Reflection.Emit
命名空间中的类型来动态生成动态程序集(其中包含动态类型)。
Reflection和Reflection.Emit
命名空间都提供了用于处理CLR类型的方法和属性的API。
据我所知,属性是由C#编译器作为方法实现的,所以我想知道在动态发出它们时应该如何处理这些属性?
属性应该使用MethodBuilder
还是使用PropertyBuilder
发出?(即:通过调用DefineMethod
或DefineProperty
?)
有没有建议一种方法优于另一种方法?
应该使用
MethodBuilder
还是使用PropertyBuilder
来发射属性?
两者都有。如果您有一个读写属性X
,那么在CIL中,它表示为一个get方法(通常称为get_X
)、一个set方法(通常也称为set_X
)和一个正确称为X
的指向这两个方法的方法。
因此,要使用Reflection.Emit创建属性,您应该:
- 使用
MethodBuilder
创建get方法(可能是从某个字段读取) - 使用另一个
MethodBuilder
来创建set方法(可能写入同一字段) - 使用
PropertyBuilder
创建属性,设置其Name
并调用SetGetMethod()
和SetSetMethod()
如果要创建只读属性,只需跳过步骤2,不要调用GetSetMethod()
。