【问题标题】:Why would a typebuilder spit out two .ctor methods?为什么类型生成器会吐出两个 .ctor 方法?
【发布时间】: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 代码往往偏长......不过,它会受到欢迎!

标签: c# .net vb.net


【解决方案1】:

你确定不是.cctor?但是您有责任在TypeBuilder 中创建所有构造函数;除了DefineConstructor() 之外,您是否还打电话给DefineDefaultConstructor()?这将创建一个空的默认构造函数...所以如果您不想要 empty 构造函数,请不要调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    相关资源
    最近更新 更多