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に、 Initializer サブに次のものを用意しました。

Public Sub InitializeTypes()
    Woo_Type.AddType("int", Woo_tpInt)
    Woo_Type.AddType("String", Woo_tpInt)
End Sub

しかし、それも明らかにうまくいかないことにすぐに気付きました。

これは紛らわしいように思えるかもしれませんが、基本的に、すべてが機能するようにこれをより適切に構造化する方法を考えています...

4

2 に答える 2

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"))
于 2012-07-06T14:25:34.347 に答える
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
于 2012-07-06T14:27:38.667 に答える