2013-03-06 18 views
9

VB.NETでは、CTypeを使用してあるタイプを別のタイプに変換することができます。動的な第2パラメータ(タイプ)を持つVB.NETのCType

私はインスタンスオブジェクトクラスに格納されている "式"を持っています。例えば"objExp"です。 Typeクラスのインスタンスに格納されている "type"は、たとえば"objType"です。

私は試していますCType(objExp, objType) コンパイルエラーが発生しました。どうすればよいですか?実行時に "objType"がフェッチされ、割り当てられます。

+0

'CType' **は、コンパイル時に** expression''ので、オブジェクトがあるタイプコンパイラに伝えるために使用され、 'type'がが知らなければなりません。しかし、あなたはどんなエラーになりますか? –

+0

実行時まで不明な場合はどこに結果を格納しますか?この種の変換では、単に** System.Convert.ChangeType **に依存することができます。これは別のXY問題ですか? –

+0

@TimSchmelter、エラーは "タイプ 'objType'が定義されていません" – Brij

答えて

1

これは単に不可能です。にオブジェクトをキャストしても意味がありません場合はCType式はIntegerString、などのようなコンパイル時に知られているTypeインスタンスを渡さなければならない...それはタイプType

0

のある値を受け入れていません可変型(コンパイル時に不明な型)。キャスティングの全体のポイントは、正確なタイプを指定することです。私は、Typeオブジェクトを使用するのではなく、実際に必要なのはジェネリックメソッドまたはジェネリッククラスであると考えています。例えば:それがないすべてのプロパティをキャストし、その型としてそれを返しますが、あなたが何を知らなくてもTを型にキャストする方法を示し、具体的には、Tがに起こるされているので、本当に無意味な方法です

Public Function DoSomethingGenerically(Of T)(MyParameter As MyType) As T 
    Return CType(MyParameter.MyProperty, T) 
End Function 

さあ。その後、あなたはこのようにそれを呼び出すことができます。

Dim x As New MyType() 
Dim y As MyType2 = DoSomethingGenerically(Of MyType2)(x) 

正確にどのようにList(Of T)クラスであり、および他の同様の一般的なクラスが実装されていること。代わりに、個々の方法は、一般的な作りで、彼らは、例えば、クラス全体がジェネリックにする、を除い:

Public Class MyList(Of T) 
    Public Sub Add(item As T) 
     ' ... 
    End Sub 
End Class 
+0

これは主にCType(x、MyType2)とどう違うのですか?より多くの入力 - 同じ結果。ジェネリックスとCTypeの両方で、型はコンパイル時に知られていなければなりません。 – Neolisk

+1

@Neolisk、あなたは正しいです、コンパイル時でも、型はジェネリック型である必要がありますが、ジェネリックメソッド自体ではなく、呼び出し元によって型が指定されている必要があります。私が答えて言ったように、私が示した方法の例は無意味でした。これは、ジェネリック型の仕組みを実証することを意味していました。 –

16

あなたは)(CTypeDynamicメソッドに見たことがありますか?第2のパラメータ(すなわち:タイプ)は動的に設定することができる。リフレクションを使用しているときに最適です。例えば

CTypeDynamic(strValueToConvert, objTypeToConvertTo) 
+1

この回答は私には役に立ちます。これは一番上の答えではないのですか? – Arvin

+1

1つの理由から、 'CTypeDynamic'の戻り値の型は' Object'ですが、残念ですが明らかに避けられないものです。 –

+0

完璧に動作します! – HumbleBeginnings

関連する問題