14

実行時にのみ型がわかっている場合に、動的に値をキャストできるようにしたいと思います。このようなもの:

myvalue = CType(value, "String, Integer or Boolean")

タイプ値を含む文字列は引数として渡され、データベースからも読み取られ、値は文字列としてデータベースに格納されます。

これは可能ですか?

4

5 に答える 5

9
 Dim bMyValue As Boolean
 Dim iMyValue As Integer
 Dim sMyValue As String 
 Dim t As Type = myValue.GetType


 Select Case t.Name
     Case "String"
        sMyValue = ctype(myValue, string)
     Case "Boolean"
        bMyValue = ctype(myValue, boolean)
     Case "Integer"
        iMyValue = ctype(myValue, Integer)
 End Select

少しハックですが、動作します。

于 2008-10-30T20:14:05.193 に答える
7

もちろんですがmyvalue、タイプとして定義するObject必要があり、必ずしもそれが必要なわけではありません。おそらく、これはジェネリックスの方が適しているケースです。

どのタイプが使用されるかを決定するものは何ですか?

于 2008-10-30T19:49:45.430 に答える
5

これが最短の方法です。複数のタイプでテストしました。

Sub DoCast(ByVal something As Object)

    Dim newSomething = Convert.ChangeType(something, something.GetType())

End Sub
于 2008-10-30T20:10:06.200 に答える
4

では、どのタイプが必要かをどのように判断しますか? Joel が言ったように、これはおそらくジェネリックのケースです。問題は、コンパイル時に型がわからないため、返された値を処理できないため、ここではキャストが実際には意味をなさないということです。

于 2008-10-30T19:52:28.340 に答える
2

おそらく、何かを動的にキャストする代わりに(これは機能していないようです)、代わりにリフレクションを使用できます。特定のメソッドまたはプロパティを取得して呼び出すのは簡単です。

Dim t As Type = testObject.GetType()
Dim prop As PropertyInfo = t.GetProperty("propertyName")
Dim gmi As MethodInfo = prop.GetGetMethod()
gmi.Invoke(testObject, Nothing)

きれいではありませんが、多くの代わりに1行でその一部を実行できます。

于 2008-10-30T20:03:36.760 に答える