VB.net setValue给结构体赋值无效

时间:2021-07-19 13:39:58


    Public Structure objTest
        Public TestField1 As String
        Public TestField2 As String
    End Structure

    Sub TestGetSetValue()

        Dim Test1 As objTest
        Test1.TestField1 = "Value1"
        Test1.TestField2 = "Value2"

        For Each tempInfo As Reflection.FieldInfo In Test1.GetType.GetFields

            MessageBox.Show(tempInfo.GetValue(Test1))
            'Value1
            tempInfo.SetValue(Test1, "newValue")
            MessageBox.Show(tempInfo.GetValue(Test1))
            '期待值“newValue",实际值”Value1“
        Next

    End Sub


请教一下,为什么上面的例子中SetValue为什么无效,GetValue都完全没问题啊
虽然这是一个非常简单的问题,但是已经折腾我这个小白很长时间了,我百度上都找过实在找不到答案,期望前辈赐教,非常感谢

14 个解决方案

#1


Structure是值类型,你要自己装拆箱再用setvalue

#2


不论getvvalue还是setvalue,都是在值类型数据的副本上操作。

你如果想反射,就把struct 彻底忘记吧!

#3


如果你使用 Structure,你会随随便便地就写出一堆会造成对象值整个复制的代码。本来可能你想象的是Structure简单、快,结果适得其反。

一般来说,避免使用 Structure 吧。

#4


是啊,用类可以,不过感觉结构体方便点

#5


引用 1 楼 xdashewan 的回复:
Structure是值类型,你要自己装拆箱再用setvalue
不好意思,请问可以具体点吗,我实在太菜了

#6


引用 5 楼 impasse 的回复:
不好意思,请问可以具体点吗,我实在太菜了

看看这文章http://www.cnblogs.com/dabiaoge/p/4112581.html

#7


引用 6 楼 xdashewan 的回复:
Quote: 引用 5 楼 impasse 的回复:

不好意思,请问可以具体点吗,我实在太菜了

看看这文章http://www.cnblogs.com/dabiaoge/p/4112581.html
有VB.NET的吗,没学过C#哈哈,你可能要抓狂了

#8


引用 7 楼 impasse 的回复:
看看这文章http://www.cnblogs.com/dabiaoge/p/4112581.html
有VB.NET的吗,没学过C#哈哈,你可能要抓狂了
原理都是一样的,而且很多代码都共同的
看看这篇http://www.chengxuyuans.com/VB.NET/91810.html

#9


field.SetValue(model, value)出错了
看答案的红字部分“ 要用Field进行反射

#10


(没复制全) VB.net setValue给结构体赋值无效
看答案的红字部分: 这里建议用属性进行反射,而不要用Field进行反射。

#11


引用 10 楼 Tiger_Zhao 的回复:
(没复制全) VB.net setValue给结构体赋值无效
看答案的红字部分: 这里建议用属性进行反射,而不要用Field进行反射。
用field灵活性更大

#12


VB.net setValue给结构体赋值无效还有人回消息吗

#13


跟属性还是字段没有关系。当你对 structure 对象反射,规范的(和公开的)反射方法实际上是在赋值时已经就是对结构体对象副本操作了。

规范的 .net 功能中并不支持你要的功能。所以不要使用 structure。就算是你觉得structure方便,那么要么你不要反射它,根本就不使用反射。

#14


执行 Test1.TestField1 = "Value1" 语句,是直接了当的。

反射,相信你懂是什么意思吧?反射是绕了一大圈,降低了数百倍性能,丧失了编译机制的直接了当特性,中间有无数的对象处理过程。这中间你对于引用类型对象这样处理(容忍上述问题存在)也就罢了,而对于 structure 对象处理你就必须面对你处理的是对象副本(而非原来的对象)的问题。人家 .net 机制本来就是如此。

#1


Structure是值类型,你要自己装拆箱再用setvalue

#2


不论getvvalue还是setvalue,都是在值类型数据的副本上操作。

你如果想反射,就把struct 彻底忘记吧!

#3


如果你使用 Structure,你会随随便便地就写出一堆会造成对象值整个复制的代码。本来可能你想象的是Structure简单、快,结果适得其反。

一般来说,避免使用 Structure 吧。

#4


是啊,用类可以,不过感觉结构体方便点

#5


引用 1 楼 xdashewan 的回复:
Structure是值类型,你要自己装拆箱再用setvalue
不好意思,请问可以具体点吗,我实在太菜了

#6


引用 5 楼 impasse 的回复:
不好意思,请问可以具体点吗,我实在太菜了

看看这文章http://www.cnblogs.com/dabiaoge/p/4112581.html

#7


引用 6 楼 xdashewan 的回复:
Quote: 引用 5 楼 impasse 的回复:

不好意思,请问可以具体点吗,我实在太菜了

看看这文章http://www.cnblogs.com/dabiaoge/p/4112581.html
有VB.NET的吗,没学过C#哈哈,你可能要抓狂了

#8


引用 7 楼 impasse 的回复:
看看这文章http://www.cnblogs.com/dabiaoge/p/4112581.html
有VB.NET的吗,没学过C#哈哈,你可能要抓狂了
原理都是一样的,而且很多代码都共同的
看看这篇http://www.chengxuyuans.com/VB.NET/91810.html

#9


field.SetValue(model, value)出错了
看答案的红字部分“ 要用Field进行反射

#10


(没复制全) VB.net setValue给结构体赋值无效
看答案的红字部分: 这里建议用属性进行反射,而不要用Field进行反射。

#11


引用 10 楼 Tiger_Zhao 的回复:
(没复制全) VB.net setValue给结构体赋值无效
看答案的红字部分: 这里建议用属性进行反射,而不要用Field进行反射。
用field灵活性更大

#12


VB.net setValue给结构体赋值无效还有人回消息吗

#13


跟属性还是字段没有关系。当你对 structure 对象反射,规范的(和公开的)反射方法实际上是在赋值时已经就是对结构体对象副本操作了。

规范的 .net 功能中并不支持你要的功能。所以不要使用 structure。就算是你觉得structure方便,那么要么你不要反射它,根本就不使用反射。

#14


执行 Test1.TestField1 = "Value1" 语句,是直接了当的。

反射,相信你懂是什么意思吧?反射是绕了一大圈,降低了数百倍性能,丧失了编译机制的直接了当特性,中间有无数的对象处理过程。这中间你对于引用类型对象这样处理(容忍上述问题存在)也就罢了,而对于 structure 对象处理你就必须面对你处理的是对象副本(而非原来的对象)的问题。人家 .net 机制本来就是如此。