2010-10-19 1 views
2

Я в настоящее время переопределяю сеттер данного класса с Reflection.Emit. Все работает отлично, за исключением, когда я использую его с обнуляемой собственностью ....Операция может дестабилизировать время выполнения при выпуске нулевого сеттера

Вот код я использую:

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); 

У вас есть ключ?

EDIT:, как указано в ответе проблема заключается в тесте равенства ... Я так удалил irrelevants часть ...

ответ

2

Как всегда, первое, что нужно сделать, это посмотреть на то, что аналогичный код в C# генерируется как IL, например, через отражатель.

Я не на ПК, но что «ceq» выглядит подозрительно; что работает только для некоторых примитивов и ссылок; «поднятые» равны будут проверять значение HasValue каждого, получать значения каждого из них и использовать соответствующий тест равенства - возможно, «ceq», но, возможно, через статический вызов оператору равенства (op_ *).

+0

Это то, что я нашел 5 мин. Назад :) Теперь я ищу, как проверить равенство двух значений ... –

+1

@ Jmix90 - вы можете жестко закодировать несколько, которые используют «ceq», else op_Equality или .Equals. Вы, вероятно, можете взять мой код, если хотите (из protobuf-net v2, который много испускает); Я по-прежнему не на ПК, но я могу привести файлы позже, если вы захотите. –