3

構造化タイプにキャストし、メンバーを変更する必要があるオブジェクトタイプ変数(control .Tag)があります。これは、考案された代表的な例です。

Public Structure struct_COLOURS
  Dim ILikeRed as boolean
  Dim ILikeGreen as boolean
End Structure

Dim AnObject as Object = (some source that is struct_COLOURS)

DirectCast(AnObject, struct_COLOURS).ILikeRed = True ' This is not valid syntax?!

C構文をよく覚えていませんが、次のようになります。

(struct_COLOURS*)AnObject->ILikeRed = true;

重要なのは、オブジェクトを何かにキャストして、結果のキャストにメンバーを設定できることです。DirectCastは実際には関数であり、私が解釈する方法でキャストしていないようです。

奇妙なことに、メンバー値のみを取得する場合は、DirectCastを使用できます。

dim YummyRed AS Boolean = DirectCast(AnObject, struct_COLOURS).ILikeRed

大丈夫です!

希望どおりにキャストできず、これらの構造を格納するためにTagプロパティの使用を変更できない場合(提案しないでください、オプションではありません)、メンバーを設定する最も速い方法は何ですか?

4

2 に答える 2

7

DirectCastは実際には関数であり、私が解釈する方法でキャストしていないようです。

いいえ、それは間違っています。DirectCastメソッドではなく、Cでのキャストのような実際の言語構造です。

ただし、構造体(=値型)をオブジェクトに格納すると、ボックス化され、結果としてコピーされます。これがここで問題を引き起こしています。元のボックス化されたオブジェクトではなく、コピーを変更しようとしています。

したがって、ボックス化された値型オブジェクトのメンバーを変更するには、オブジェクトをコピーし、その値を変更して、コピーして戻す必要があります。

Dim tmp = DirectCast(AnObject, struct_COLOURS)
tmp.ILikeRed = True
AnObject = tmp

ちなみに、Cキャスト構文と表面的には類似しているにもかかわらず、C#でも同じことが言えます。

于 2011-08-19T13:31:21.767 に答える
-2

それがキャスト方法です-CTypeを使用:

Dim myColor As Object = Nothing
        Dim color As Color = CType(myColor, Color)
        color.Name = "red"

なぜクラスではなく構造体なのですか?

于 2011-08-19T13:38:42.347 に答える