[英]Setting a value through reflection is not working
我试图通过反思来设定价值。 我创建了这个小测试程序
struct headerIndexes
{
public int AccountNum{ get; set; }
public int other { get; set; }
public int items { get; set; }
}
static void Main(string[] args)
{
headerIndexes headers = new headerIndexes();
headers.AccountNum = 1;
Console.WriteLine("Old val: {0}", headers.AccountNum);
foreach (var s in headers.GetType().GetProperties())
{
if (s.Name == "AccountNum")
s.SetValue(headers, 99, null);
}
Console.WriteLine("New val: {0}", headers.AccountNum);
Console.ReadKey();
}
在我正确看到它的程序中执行命令s.SetValue(headers, 99, null);
但是,当运行setValue时,headers.AccountNum的值保持为1。
我错过了一个明显的步骤吗?
我认为标题可能会被装入一个新对象,因为它是一个结构,然后一旦SetValue返回,该对象就会收集垃圾。 将其更改为班级,看看问题是否消失。
SetValue
期望一个object
导致对headers
进行装箱操作。 由于headers
是struct
,因此它是值类型。 因此,会创建一个副本,您要修改的是盒装对象而不是headers
。
您应该认真考虑避免使用可变值类型。
来自Eric Lippert :
这是可变值类型是邪恶的另一个原因。 尝试始终使值类型不可变。
您也可以使用未装箱的struct版本。
object unboxedHeader = headers;
s.SetValue(unboxedHeader,99,null);
struct headerIndexes
{
public int AccountNum{ get; set; }
public int other { get; set; }
public int items { get; set; }
}
static void Main(string[] args)
{
headerIndexes headers = new headerIndexes();
headers.AccountNum = 1;
Console.WriteLine("Old val: {0}", headers.AccountNum);
object unboxedHeader=headers;
foreach (var s in headers.GetType().GetProperties())
{
if (s.Name == "AccountNum")
s.SetValue(unboxedHeader, 99, null);
}
Console.WriteLine("New val: {0}", headers.AccountNum);
Console.ReadKey();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.