実行時にのみ型がわかっている場合に、動的に値をキャストできるようにしたいと思います。このようなもの:
myvalue = CType(value, "String, Integer or Boolean")
タイプ値を含む文字列は引数として渡され、データベースからも読み取られ、値は文字列としてデータベースに格納されます。
これは可能ですか?
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
少しハックですが、動作します。
もちろんですがmyvalue
、タイプとして定義するObject
必要があり、必ずしもそれが必要なわけではありません。おそらく、これはジェネリックスの方が適しているケースです。
どのタイプが使用されるかを決定するものは何ですか?
これが最短の方法です。複数のタイプでテストしました。
Sub DoCast(ByVal something As Object)
Dim newSomething = Convert.ChangeType(something, something.GetType())
End Sub
では、どのタイプが必要かをどのように判断しますか? Joel が言ったように、これはおそらくジェネリックのケースです。問題は、コンパイル時に型がわからないため、返された値を処理できないため、ここではキャストが実際には意味をなさないということです。
おそらく、何かを動的にキャストする代わりに(これは機能していないようです)、代わりにリフレクションを使用できます。特定のメソッドまたはプロパティを取得して呼び出すのは簡単です。
Dim t As Type = testObject.GetType()
Dim prop As PropertyInfo = t.GetProperty("propertyName")
Dim gmi As MethodInfo = prop.GetGetMethod()
gmi.Invoke(testObject, Nothing)
きれいではありませんが、多くの代わりに1行でその一部を実行できます。