ValueTuple 通过反射设置字段

ValueTuple set fields via reflection

我正在尝试使用反射在运行时设置 ValueTuple 的字段,但遇到了问题。我怀疑我不了解 FieldInfo.SetValue 的工作原理。

var a = (5, 5);
a.Item1 = 6;
Console.WriteLine(a.Item1); // 6

var t = a.GetType();
var f = t.GetField("Item1");
f.SetValue(a, 10);
Console.WriteLine(a.Item1); // 6 - Why not 10?

有什么见解吗?

问题是当您将元组传递给 SetValue 时,您正在对元组进行装箱,因此它设置了一个副本。如果您通过 object 变量将其装箱,将其传入,然后再拆箱,您将看到更改。这是一个完整的示例,改编了上面的代码:

using System;

class Test
{
    static void Main()
    {
        var a = (5, 5);
        a.Item1 = 6;
        Console.WriteLine(a.Item1); // 6

        var t = a.GetType();
        var f = t.GetField("Item1");
        object obj = a;
        f.SetValue(obj, 10);
        a = ((int, int)) obj;
        Console.WriteLine(a.Item1); // 10
    }
}