在保持结构正确的同时设置这些类型
问题描述:
我完全停留在一种情况下,我不知道从哪里开始。我正在创建一个非常大的项目,因此我的目标是尽可能保持代码本身的清洁,并尽可能保持尽可能多的黑客行为。在保持结构正确的同时设置这些类型
这是情况。
我有一个叫Woo_Type
的类,它是我的许多派生类的父类。
Public MustInherit Class Woo_Type
Private Shared TypeList As New Dictionary(Of String, Woo_Type)
Public MustOverride Sub SetValue(ByVal val As Object)
Public MustOverride Function GetValue() As Object
Public Shared Function GetTypeFromName(ByVal name As String) As Woo_Type
Return TypeList(name)
End Function
Public Shared Sub AddType(ByVal name As String, ByVal def As Woo_Type)
TypeList.Add(name, def)
End Sub
End Class
我有很多类,从Woo_Type
继承也有类似的结构如下:
Public Class Woo_tpInt
Inherits Woo_Type
Private value As Integer = 0
Public Overrides Function GetValue() As Object
Return value
End Function
Public Overrides Sub SetValue(val As Object)
value = val
End Sub
End Class
我希望能够做的事情,如:
Woo_Type.GetTypeFromName("int")
而且具有它返回类似什么东西...
在这一点上,我真的很困惑,因为我想要什么,我不知道是否有人有任何建议。为了确保GetTypeFromName
工作正常,我不得不在初始化程序分以下:
Public Sub InitializeTypes()
Woo_Type.AddType("int", Woo_tpInt)
Woo_Type.AddType("String", Woo_tpInt)
End Sub
但我很快意识到,这显然也不行。
所以这可能看起来混乱,但基本上,我想知道如何更好地构建这种让一切正常......
答
你想对结果做什么?你确定你不只是需要泛型?
Public Class WooType(Of T)
Public Property Value As T
End Class
Public Class Test
Public Sub Foo()
Dim int As New WooType(Of Integer)
int.Value = 42
Dim str As New WooType(Of String)
str.Value = "Forty-Two"
End Sub
End Class
答
如果你想要做的就是让该类型本身(而不是一个对象)我会建议使用反射而不是试图重新发明*。例如,为了获得Woo_tpInt
类型,你可以这样做:
Dim a As Assembly = Assembly.GetExecutingAssembly()
Dim t As Type = a.GetType("WindowsApplication1.Woo_tpInt") ' Change WindowsApplication1 to whatever your namespace is
如果你想使用更短的名称,如"int"
意味着"WindowsApplication1.Woo_tpInt"
,你可以创建一个字典来存储转换表,例如:
Dim typeNames As New Dictionary(Of String, String)
typeNames.Add("int", GetType(Woo_tpInt).FullName)
Dim a As Assembly = Assembly.GetExecutingAssembly()
Dim t As Type = a.GetType(typeNames("int"))
你想GetTypeFromName返回什么?一个“类型”或这种类型的对象? – 2012-07-06 14:02:53
@SteveDog我认为只是类型... – FreeSnow 2012-07-06 14:07:30