jeudi 25 février 2021

I am attempting to use Reflection.FieldInfo.SetValue on a structure field to modify its value, but to no avail. Why? (Code in C# and VB provided.) [duplicate]

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