gpt4 book ai didi

vb.net - 对结构的反射(reflection)与类有所不同-但仅在代码方面

转载 作者:行者123 更新时间:2023-12-04 17:42:31 25 4
gpt4 key购买 nike

程式码片段:

Dim target As Object
' target gets properly set to something of the desired type
Dim field As FieldInfo = target.GetType.GetField("fieldName", _
BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic)
field.SetValue(target,newValue)

如果将target设置为CLASS的实例,则此代码片段可以正常运行。

但是,如果将target设置为STRUCTURE的实例,则该代码实际上不会更改该字段的值。没有错误,但该值保持不变。

而且,奇怪的是,如果我单步执行代码,请注意SetValue不能执行任何操作,然后立即转到“立即”窗口,然后键入完全相同的SetValue操作,即可正常工作。

关于正在发生的事情以及如何实际更改CODE中的字段的任何建议?

编辑:

根据Jon Skeet的要求,实际代码为:
Private Shared Function XmlDeserializeObject(ByVal objectType As Type, _
ByVal deserializedID As String) As Object
Dim result As Object
result = CreateObject(objectType)

mXmlR.ReadStartElement()
Do While mXmlR.IsStartElement _
AndAlso mXmlR.Name <> elementItem
Dim field As FieldInfo = result.GetType.GetField(FullName, _
BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic)
field.SetValue(result, XmlDeserialize(field.FieldType))
Loop

Return result
End Function

外部变量和调用例程:
* mXmlR是一个XmlTextReader,并且已正确初始化和定位(否则这不适用于类)
* CreateObject的工作原理(同上)
* XmlDeserialize在大多数情况下都可以正常工作,并且有问题的地方是处理整数就可以了。唯一已知的问题是结构。

至于我如何检查值,我主要看的是Locals窗口,但我也在Instant窗口中使用了print语句,并且我正在运行NUnit测试,由于该问题,该测试失败了-而通过类而不是结构的等效测试通过。

这是测试。
<Serializable()> Private Structure SimpleStructure
Public MemberOne As Integer
End Structure

<Test()> Sub A016_SimpleStructure()
Dim input As New SimpleStructure
input.MemberOne = 3
Dim st As String = Serialize(input)
Debug.Print(st)
Dim retObject As Object = Deserialize(st)
Assert.IsNotNull(retObject)
Assert.IsInstanceOfType(GetType(SimpleStructure), retObject)
Assert.AreEqual(input.MemberOne, DirectCast(retObject, SimpleStructure).MemberOne)
End Sub

最佳答案

使用您的原始样本,我同意它可以在C#中使用,但不能在VB中使用!如果您使用Reflector或ILDasm,您将看到对Field.SetValue(target,...)的调用实际上已编译为(在VB中)为:

field.SetValue(RuntimeHelpers.GetObjectValue(target), ...)

“GetObjectValue”如果它是值类,则返回obj的盒装副本;否则返回obj本身。 IE。该值是在您的结构副本上设置的!

This link给出了解释(例如它是)。解决方法是将目标声明为System.ValueType而不是Object。我不确定这对您的实际代码是否真的有帮助:您可能需要进行杂乱的类型测试才能将值类型与引用类型分开处理。

关于vb.net - 对结构的反射(reflection)与类有所不同-但仅在代码方面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/448158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com