You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Python的EIP712Struct代码正确转换为VB.NET?

解决VB.NET转换EIP712Struct时子类名称获取问题

核心问题分析

Python中通过__init_subclass__给子类自动绑定type_name属性,在构造函数中传递给基类。但VB.NET中:

  • 构造函数调用MyBase时,Me的成员未初始化,但GetType()能获取实例的实际类型(子类)
  • 共享属性/方法中的GetType()返回基类类型,无法拿到子类名称

解决方案

直接利用实例的GetType().Name获取子类名称,无需额外的类级别属性绑定,替代Python中的type_name逻辑。

转换后的核心代码

Public Class EIP712Struct
    Inherits EIP712Type

    Private _values As Dictionary(Of String, Object)

    ' 替代Python的**kwargs,用Dictionary接收关键字参数
    Public Sub New(kwargs As Dictionary(Of String, Object))
        ' 直接用Me.GetType().Name获取子类名称,传递给基类构造
        MyBase.New(Me.GetType().Name, Nothing)
        
        Dim members = Me.GetMembers() ' 对应Python的get_members(),需实现获取结构化成员的逻辑
        _values = New Dictionary(Of String, Object)()

        For Each member In members
            Dim memberName = member.Item1
            Dim memberType = member.Item2

            If kwargs.ContainsKey(memberName) Then
                Dim value = kwargs(memberName)
                ' 处理字典转结构体实例的逻辑
                If TypeOf value Is Dictionary(Of String, Object) Then
                    value = Activator.CreateInstance(memberType, value)
                End If
                _values.Add(memberName, value)
            End If
        Next
    End Sub

    ' 如果需要对外暴露类型名称,提供实例属性
    Public ReadOnly Property TypeName As String
        Get
            Return Me.GetType().Name
        End Get
    End Property
End Class

子类使用示例

Public Class MyStruct
    Inherits EIP712Struct

    ' 对应Python的类成员定义,需结合自定义属性/元数据实现成员类型标记(模拟OrderedAttributesMeta的功能)
    ' 示例:用自定义Attribute标记成员类型
    <EIP712Member(Type:=GetType(StringType))>
    Public Property some_param As Object
End Class

' 实例化调用
Dim structParams = New Dictionary(Of String, Object) From {
    {"some_param", "some_value"}
}
Dim structInstance = New MyStruct(structParams)

关键说明

  • 基类构造中Me.GetType().Name返回的是子类的类名,因为实例是子类对象,即使在基类构造函数中,GetType()也会指向实际的实例类型
  • 无需模拟Python的__init_subclass__,实例属性TypeName会自动返回当前子类的名称
  • Python的**kwargs在VB.NET中用Dictionary(Of String, Object)替代,实现关键字参数的传递逻辑

内容的提问来源于stack exchange,提问作者Andri Timur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:20:20