3

我正在尝试使用反射在运行时设置 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?

有什么见解吗?

4

1 回答 1

6

问题是当你将元组传递给时你正在装箱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
    }
}
于 2019-11-22T19:26:59.410 回答