I can't figure out what I am doing wrong. I've got this code:
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)
Why?
I was looking for answer, but I have found nothing.
Ah, the joys of mutable structs. As Sergey said, Point
is a struct. When you're calling PropertyInfo.SetValue
, you're taking the value of p
, boxing it (which copies the value), modifying the contents of the box... but then ignoring it.
You can still use reflection with it - but importantly, you only want to box it once. So this works:
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}
Note that this won't change the value of p
, but you can unbox it again afterwards:
object boxed = p;
property.SetValue(boxed, ...);
p = (Point) boxed;
See more on this question at Stackoverflow