ValueTuple set fields via reflection

MgS*_*Sam 2 .net c# tuples valuetuple

我正在尝试使用反射在运行时设置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?
Run Code Online (Sandbox Code Playgroud)

有见识吗?

Jon*_*eet 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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @MgSam:首先,它们在泛型之前就已经存在。但是通常,如果您要进行反射,那是因为您在编译时不知道类型-因此,我怀疑通用版本很少有用。 (2认同)