2010-10-19 72 views
2

我目前正在用Reflection.Emit重写给定类的setter。 一切正常,除非我有一个可为空属性使用精细....当发射一个可为null的setter时,操作可能会破坏运行时的稳定性

这里是代码我使用:

ilSetterGen.Emit(OpCodes.Ldarg_0); 
ilSetterGen.Emit(OpCodes.Call, baseGetter); 
ilSetterGen.Emit(OpCodes.Ldarg_1); 
ilSetterGen.Emit(OpCodes.Ceq); 
Label retLabel = ilSetterGen.DefineLabel(); 
ilSetterGen.Emit(OpCodes.Brtrue_S, retLabel); 



ilSetterGen.MarkLabel(retLabel); 
ilSetterGen.Emit(OpCodes.Ret); 

你有什么线索?

编辑:作为答案的问题是在平等的测试指出...我删除之irrelevants部分...

回答

2

与往常一样,做的第一件事就是看什么类似的代码在C#中生成为IL,例如通过反射器。

我不是个人电脑,但“ceq”看起来有嫌疑;只适用于一些基元和参考;一个“提升的”equals将检查每个的HasValue,获取每个的值,并使用适当的相等性测试 - 可能通过“ceq”,但可能通过对相等运算符(op_ *)的静态调用。

+0

这正是我已经找到5分钟前:)现在我正在寻找了解如何测试两个值... – 2010-10-19 14:43:03

+1

@ Jmix90的平等 - 你可以硬编码使用“经济学季刊”了几下,其他的op_Equality或.Equals。如果你想要的话,你可以借用我的代码(从protobuf-net v2中发出很多)。我仍然不在个人电脑上,但如果你愿意,我可以在以后引用这些文件。 – 2010-10-19 14:57:34

相关问题