如何将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
相关产品推荐
相关产品推荐

