【发布时间】:2008-11-02 09:09:55
【问题描述】:
我有一个类型生成器,它生成两个相同的 .ctors,一个没有方法主体,另一个包含所有初始化代码。
我正在定义另一个类型的字段和访问该类型的属性,因此需要在 .ctor 中对其进行初始化
我应该从哪里开始寻找
代码如下
Public Sub ctor(ByVal type As TypeBuilder, ByVal FieldRefs As Dictionary(Of Type, FieldBuilder))
' Method attributes
Dim methodAttributes As System.Reflection.MethodAttributes = MethodAttributes.[Public]
Dim method As MethodBuilder = type.DefineMethod(".ctor", methodAttributes)
' Preparing Reflection instances
Dim ctor1 As ConstructorInfo = GetType(Object).GetConstructor(BindingFlags.Instance Or BindingFlags.[Public] Or BindingFlags.NonPublic, Nothing, Nothing, Nothing)
' Setting return type
method.SetReturnType(GetType(Void))
' Adding parameters
Dim gen As ILGenerator = method.GetILGenerator()
' Writing body
gen.Emit(OpCodes.Ldarg_0)
gen.Emit(OpCodes.[Call], ctor1)
'new up fields
For Each item In FieldRefs
AddCtor(type, gen, item.Value, item.Key)
Next
gen.Emit(OpCodes.Ret)
' finished
End Sub
Private Sub AddCtor(ByVal type As TypeBuilder, ByVal gen As ILGenerator, ByVal FieldBuilderRef As FieldBuilder, ByVal TypeToReference As Type)
Dim TypeCtor = TypeToReference.GetConstructor(BindingFlags.Instance Or BindingFlags.[Public] Or BindingFlags.NonPublic, Nothing, New Type() {}, Nothing)
gen.Emit(OpCodes.Ldarg_0)
gen.Emit(OpCodes.Newobj, TypeCtor)
gen.Emit(OpCodes.Stfld, FieldBuilderRef)
End Sub
代码接受类型为 fieldbuilder 的字典以在 ctor 中发出。在 typebuilder 主例程中新建字段
【问题讨论】:
-
@pablito - TypeBuilder 代码往往偏长......不过,它会受到欢迎!