2012-07-06 47 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")) 
相關問題