程序 :
public class ClassExample
{
public string myString;
}
public struct StructExample {
public string myString;
}
public class FieldInfo_SetValue
{
public static void Main()
{
ClassExample c = new ClassExample();
StructExample s = new StructExample();
object o = s;
ArrayList al = new ArrayList();
al.Add(s);
Type cType = c.GetType();
FieldInfo cFieldInfo = cType.GetField("myString");
cFieldInfo.SetValue(c, "value");
Console.WriteLine("ClassExample:" + c.myString);
Type sType = s.GetType();
FieldInfo sFieldInfo = sType.GetField("myString");
sFieldInfo.SetValue(s,"value");
Console.WriteLine("StructExample:" + s.myString);
sFieldInfo.SetValue(o, "value");
Console.WriteLine("objectExample:" + ((StructExample)o).myString);
sFieldInfo.SetValue(al[0], "value");
Console.WriteLine("ArrayList:" + ((StructExample)al[0]).myString);
Console.Read();
}
}
结果
ClassExample:value
StructExample:
objectExample:value
ArrayList:value
结果表明在
sFieldInfo.SetValue(s,"value"); ////这儿有个装箱过程setvalue(s,"value")时s被copy了一份
//这样操作的结果是在SetValue另一个StructExample 克隆被设置了值,但传入的值StructExample s并不会被改变
Console.WriteLine("StructExample:" + s.myString);
s.myString此时还是默认值String.Empty,解决的方法是传入一个引用类型还不是值类型,比如将struct转为object然后传入.或其它任何办法都行