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();
}
打印的第一个值是32,而第二个值是0.没有抛出异常
答案 0 :(得分:12)
这是因为装箱你的结构会复制它,所以你应该先装箱,这样你就可以从你修改的相同数据中调用getter。以下代码有效:
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();
答案 1 :(得分:4)
结构是ValueTypes,它们通过值传递,这意味着您只传递整个结构的副本,而不是对原始对象的引用。
因此,当您将其传递到info.SetValue(_priceStruct, 32, null)
时,会将副本传递给该方法并进行变异,因此原始对象根本不会更改。可变结构是邪恶的另一个原因。
答案 2 :(得分:1)
你仍然可以使用反射来改变它们,但它有点长篇大论。
请参阅此示例:http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/2dd4315c-0d0d-405c-8d52-b4b176997472