Mar*_*ley 3 vb.net ctype directcast
我有一个对象类型变量(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?!
Run Code Online (Sandbox Code Playgroud)
我不太清楚我的C语法,但它会是这样的:
(struct_COLOURS*)AnObject->ILikeRed = true;
Run Code Online (Sandbox Code Playgroud)
关键是我可以将对象转换为某个对象并在结果转换中设置成员.似乎DirectCast实际上是一个函数,并没有按照我解释它的方式进行转换.
奇怪的是,如果您只想检索成员值,可以使用DirectCast:
dim YummyRed AS Boolean = DirectCast(AnObject, struct_COLOURS).ILikeRed
Run Code Online (Sandbox Code Playgroud)
很好!
如果我不能按照我想要的方式进行转换,并且我无法更改Tag属性的使用(所以请不要建议,这不是一个选项)来存储这些结构,设置成员的最快方法是什么?
似乎DirectCast实际上是一个函数,并没有按照我解释它的方式进行转换.
不,那是错的:DirectCast它不是一种方法,它是一种真正的语言结构,就像C语言中的强制转换一样.
但是,如果在对象中存储结构(=值类型),它将被装箱,并因此被复制.这导致了这里的问题:您正在尝试修改副本,而不是原始的盒装对象.
因此,为了更改盒装值类型对象的成员,您需要复制对象,更改其值并将其复制回来:
Dim tmp = DirectCast(AnObject, struct_COLOURS)
tmp.ILikeRed = True
AnObject = tmp
Run Code Online (Sandbox Code Playgroud)
顺便提一下,尽管与C cast语法表面相似,但在C#中也是如此.