3

我有一个对象类型变量(控件 .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 回答