I'm attempting to use Reflection.FieldInfo.SetValue to modify a structure's integer field value. However, it doesn't get modified.
I realize, that SetValue expects an Object, but boxing the integer doesn't help either.
What is my mistake?
Here's ready to copy and paste code in C# (further below in VB as well):
using System;
using System.Reflection;
public static class Test
{
public struct SStruct
{
public int Value;
}
public static void Main()
{
// Initialize a structure record.
SStruct rStruct = new SStruct();
rStruct.Value = 42;
// Reading the Value field by name:
Type tStruct = typeof(SStruct);
FieldInfo fValue = tStruct.GetField("Value");
object oValue = fValue.GetValue(rStruct);
Console.WriteLine("Read Value Before Mod: {0}", oValue);
// Attempting to modify the Value field:
fValue.SetValue(rStruct, 21);
oValue = fValue.GetValue(rStruct);
Console.WriteLine("Read Value After Mod: {0}", oValue);
// It didn't change.
// SetValue is expecting an object though. Box the struct.
object oStruct = rStruct;
fValue.SetValue(oStruct, 21);
oValue = fValue.GetValue(rStruct);
Console.WriteLine("Read After Boxing: {0}", oValue);
// It didn't change.
Console.Read();
}
}
Here VB:
Imports System
Imports System.Reflection
Module Test
Public Structure SStruct
Public Value As Integer
End Structure
Public Sub Main()
'Initialize a structure record.
Dim rStruct As New SStruct
rStruct.Value = 42
'Reading the Value field by name:
Dim tStruct As Type = GetType(SStruct)
Dim fValue As FieldInfo = tStruct.GetField("Value")
Dim oValue As Object = fValue.GetValue(rStruct)
Console.WriteLine("Read Value Before Mod: {0}", oValue)
'Attempting to modify the Value field:
fValue.SetValue(rStruct, 21)
oValue = fValue.GetValue(rStruct)
Console.WriteLine("Read Value After Mod: {0}", oValue)
'It didn't change.
'SetValue is expecting an object though. Box the struct.
Dim oStruct As Object = rStruct
fValue.SetValue(oStruct, 21)
oValue = fValue.GetValue(rStruct)
Console.WriteLine("Read After Boxing: {0}", oValue)
'It didn't change.
Console.Read()
End Sub
End Module
Aucun commentaire:
Enregistrer un commentaire