C# 反射不适用于 Point 类?



我不知道我做错了什么。我有这样的代码:

Point p = new Point();
//point is (0,0)
p.X = 50;
//point is (50,0)
PropertyInfo temp = p.GetType().GetProperty("X");
temp.SetValue(p, 100, null);
//and point is still (50,0)
MethodInfo tt = temp.GetSetMethod();
tt.Invoke(p, new object[] { 200 });
//still (50,0)

为什么?

我一直在寻找答案,但我一无所获。

啊,可变结构的乐趣。正如Sergey所说,Point是一个结构体。当你调用PropertyInfo.SetValue时,你正在获取p的值,将其装箱(复制该值),修改盒子的内容……然后忽略它

可以仍然使用反射-但重要的是,您只需要将它框一次

object boxed = p;
PropertyInfo temp = p.GetType().GetProperty("X");
temp.SetValue(boxed, 100, null);
Console.WriteLine(boxed); // {X=100, Y=0}
MethodInfo tt = temp.GetSetMethod();
tt.Invoke(boxed, new object[] { 200 });
Console.WriteLine(boxed); // {X=200, Y=0}

注意,这个不会改变p的值,但是您可以在之后再次打开它:

object boxed = p;
property.SetValue(boxed, ...);
p = (Point) boxed;

Point是一个结构体,而不是类。它是一个值类型,并且是按值传递的。因此,当您将point传递给SetValue方法时,传递的是point的副本。这就是为什么原来的实例p没有更新。

建议阅读:Value and Reference Types

相关内容

  • 没有找到相关文章

最新更新