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