2012-07-06 35 views
0

我完全停留在一种情况下,我不知道从哪里开始。我正在创建一个非常大的项目,因此我的目标是尽可能保持代码本身的清洁,并尽可能保持尽可能多的黑客行为。在保持结构正确的同时设置这些类型

这是情况。

我有一个叫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 

但我很快意识到,这显然也不行。

所以这可能看起来混乱,但基本上,我想知道如何更好地构建这种让一切正常......

+0

你想GetTypeFromName返回什么?一个“类型”或这种类型的对象? – 2012-07-06 14:02:53

+0

@SteveDog我认为只是类型... – FreeSnow 2012-07-06 14:07:30

回答

1

你想对结果做什么?你确定你不只是需要泛型?

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 
1

如果你想要做的就是让该类型本身(而不是一个对象)我会建议使用反射而不是试图重新发明轮子。例如,为了获得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")) 
相关问题