Reflection 为什么';反射是否在结构中设置属性?
打印的第一个值为32,第二个值为0。没有抛出异常您仍然可以使用反射更改它们,但这有点冗长Reflection 为什么';反射是否在结构中设置属性?,reflection,c#-4.0,struct,properties,Reflection,C# 4.0,Struct,Properties,打印的第一个值为32,第二个值为0。没有抛出异常您仍然可以使用反射更改它们,但这有点冗长 请参见此示例:结构是按值传递的值类型,这意味着您只传递整个结构的副本,而不是对原始对象的引用 因此,当您将其传递到info.SetValue(_priceStruct,32,null)中时,一个副本将传递给该方法并进行变异,因此原始对象根本不会被更改。可变结构是邪恶的另一个原因 这是因为装箱您的结构会复制它,所以您应该更早地装箱它,以便从您修改的相同数据调用getter。以下代码起作用: class
请参见此示例:结构是按值传递的值类型,这意味着您只传递整个结构的副本,而不是对原始对象的引用
因此,当您将其传递到
info.SetValue(_priceStruct,32,null)
中时,一个副本将传递给该方法并进行变异,因此原始对象根本不会被更改。可变结构是邪恶的另一个原因 这是因为装箱您的结构会复制它,所以您应该更早地装箱它,以便从您修改的相同数据调用getter。以下代码起作用:
class PriceClass {
private int value;
public int Value
{
get { return this.value; }
set { this.value = value; }
}
}
struct PriceStruct
{
private int value;
public int Value
{
get { return this.value; }
set { this.value = value; }
}
}
static void Main(string[] args)
{
PriceClass _priceClass = new PriceClass();
Type type = typeof(PriceClass);
PropertyInfo info = type.GetProperty("Value");
info.SetValue(_priceClass, 32, null);
Console.WriteLine(_priceClass.Value);
PriceStruct _priceStruct = new PriceStruct();
type = typeof(PriceStruct);
info = type.GetProperty("Value");
info.SetValue(_priceStruct, 32, null);
Console.WriteLine(_priceStruct.Value);
Debugger.Break();
}
请参阅此问题的公认答案:+1您的示例表明我认为可以做到最好。在“安全”代码中,不可能使用反射更改真实值类型中的字段,但对于每个值类型,都有一个对应的装箱类类型。转换为具有讽刺意味的ValueType将把一个值类型转换为其对应的装箱类类型的实例,然后可以使用反射对其进行变异;经过变异后,装箱实例的内容可以复制回一个真正的值类型对象。谢谢。这是我第一次看到强制装箱(将结构转换为对象)和取消装箱(将对象转换为结构)以查看发生了什么并理解过程。其实很简单。但在我所看到的其他地方,装箱步骤都是由隐藏进程(由编译器自动完成)完成的,人们如何使用它毫无意义。
object _priceStruct = new PriceStruct(); //Box first
type = typeof(PriceStruct);
info = type.GetProperty("Value");
info.SetValue(_priceStruct, 32, null);
Console.WriteLine(((PriceStruct)_priceStruct).Value); //now unbox and get value
Debugger.Break();