vb.net - 在不知道泛型类型的情况下转换为泛型类型
问题描述
我有一个ValueControl
使用泛型类型的接口 () 和另一个ValueControlHandler
使用该接口实例的类 ()。现在,当我创建时ValueControlHandler
,CreateHandler
我需要传递泛型类型。现在TCtrl
很“容易”(我只是使用ValueControl
但我不知道如何设置TVal
.
Public Interface ValueControl(Of T)
ReadOnly Property Value As T
End Interface
Public Interface CtrlChanges
Function HasChanges() As Boolean
End Interface
Friend Class ValueControlHandler(Of TCtrl As ValueControl(Of TVal), TVal)
Implements CtrlChanges
....
End Class
Private Function DummyCreateHandler(Of TVal)(ByVal ctrl as ValueControl(Of TVal)) As CtrlChanges
Return New ValueControlHandler(Of ValueControl(Of TVal), TVal)(ctrl)
End Function
Private Function CreateHandler(ByVal ctrl As Object) As CtrlChanges
If TypeOf ctrl Is ValueControl(Of ValueControl(Of ???), ???) Then ' <!--- Problem here
Return New ValueControlHandler(Of ValueControl(Of ???), ???)(ctrl) ' <!--- Problem here
ElseIf Typeof ctrl Is AnotherType Then
Return New AnotherCtrlChanges(....)
Else
Return Nothing
End If
End Function
棘手的部分是,我什至不需要知道类型,因为我对此CtrlChanges
部分感兴趣。是删除泛型并默认为的唯一解决方案Object
吗?我也试过了,DummyCreateHandler
但我仍然不知道如何检查类型,而且它对第二次通话并没有太大帮助。
ValueControlHandler
如果这有帮助,这是完整的课程:
Friend Class ValueControlHandler(Of TCtrl As ValueControl(Of TVal), TVal)
Implements CtrlChanges
Protected ReadOnly Ctrl As TCtrl
Protected ReadOnly Val As TVal
Public Sub New(ByVal Ctrl As TCtrl)
Me.Ctrl = Ctrl
Me.Val = CurrentValue
End Sub
Public ReadOnly Property CurrentValue As TVal
Get
Return Ctrl.Value
End Get
End Property
Public Overridable Function HasChanges() As Boolean Implements CtrlChanges.HasChanges
Return CType(CurrentValue, Object) <> Val
End Function
End Class
解决方案
您是否考虑过将工厂方法作为其中的一部分ValueControl
?(旁注,接口上的“I”前缀是标准约定)
(请注意,我的 VB.NET 有点生疏,尽管我的拼写错误,但希望您能理解这种方法的意图):
Public Interface IValueControl(Of T)
ReadOnly Property Value As T
ValueControlHandler(Of T) CreateValueControlHandler(ctrl As IValueControl(Of T))
End Interface
然后每个控件都可以生成它自己的ValueControlHandler
:
Public Class MyControl Inherits Textbox Implements IValueControl(Of String)
Public Function ValueControlHandler(Of T) CreateValueControlHandler()
Return New ValueControlHandler(Of MyControl, String)(Me)
End Fucntion
End Class
推荐阅读
- javascript - 使用gcs API时,JS增量未在for循环中更新
- java - hiddenFile 数据无法进入 Android Api 30
- python - shutil.copytree(dirs_exist) 在 linux 上不起作用
- python-3.x - tkinter Treeview 表在窗口中被裁剪
- css - 如何在 Angular js 中包含我的组件的 .css 文件
- python - 使用 Python scipy.optimize.minimize 定义约束
- terminal - 通过终端“open”命令打开 *.bundle 文件?
- windows-installer - InstallShield 2020 - installscript 到 MSI - 迁移首次安装、主要升级、次要更新、补丁
- node.js - 连接到数据库时,`useFindAndModifiaed` 是无效操作
- python - 根据条件过滤元组列表