2010-10-19 53 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

相關問題