Extrait de code:Réflexion sur la structure diffère de la classe - mais seulement dans le code
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)
Cet extrait fonctionne parfaitement si la cible est définie à une instance d'une classe. Cependant, si la cible est définie sur une instance d'une STRUCTURE, le code ne change pas réellement la valeur du champ. Aucune erreur, mais la valeur reste inchangée. Et, bizarrement, si je traverse le code, regarder le SetValue échouer à faire quelque chose, et immédiatement aller à la fenêtre Exécution et tapez exactement la même opération SetValue, qui fonctionne.
Des suggestions sur ce qui se passe et comment changer le champ IN CODE?
Edit:
Par demande de Jon Skeet, code réel:
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
Variables externes et routines appelées:
* mXmlR est un XmlTextReader et est correctement initialisé et positionné (sinon ce serait ne fonctionne pas sur les classes)
* CreateObject fonctionne (idem)
* XmlDeserialize fonctionne principalement, et au point en question gère très bien un entier. Le seul problème connu est avec les structures. En ce qui concerne la façon dont je vérifie la valeur, je regarde principalement la fenêtre Locals, mais j'ai également utilisé des instructions print dans la fenêtre Immediate, et j'exécute un test NUnit qui échoue en raison de ce problème - tandis que le test équivalent avec une classe, plutôt que d'une structure, passe.
Voici le test.
<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
La langue est plutôt pertinente ici: VB.net aurait besoin d'un "ValueType foo = new Foo();" équivalent (au lieu de votre "objet foo = new Foo();" line: pour une raison qui n'est pas claire pour le moment, l'utilisation d'une variable de type objet dans VB.net a un comportement différent). – Giuseppe