2010-10-19 2 views
2

Je remplace actuellement le setter d'une classe donnée par Reflection.Emit. Tout fonctionne bien sauf quand je l'utilise avec une propriété annulable ....Une opération peut déstabiliser l'exécution lors de l'émission d'un setter à taille nulle

est le code que j'utiliser ici:

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

Avez-vous une idée?

EDIT: comme indiqué dans la réponse que le problème est dans le test d'égalité ... Je donc retiré la partie de irrelevants ...

Répondre

2

Comme toujours, la première chose à faire est de regarder ce que code similaire dans C# génère en IL, par exemple via réflecteur.

Je ne suis pas sur un PC mais ce "ceq" semble suspect; cela ne fonctionne que pour certaines primitives et références; un "lifté" égal vérifie HasValue de chacun, obtient les valeurs de chacun, et utilise le test d'égalité approprié - éventuellement par "ceq", mais peut-être via static-call à l'opérateur d'égalité (op_ *).

+0

C'est exactement ce que j'ai trouvé il y a 5 minutes :) Maintenant, je cherche à savoir comment tester l'égalité de deux valeurs ... –

+1

@ Jmix90 - vous pouvez coder en dur quelques-unes qui utilisent "ceq", else op_Equality ou .Equals. Vous pouvez probablement emprunter mon propre code si vous le voulez (de protobuf-net v2 qui émet beaucoup); Je ne suis toujours pas sur un PC mais je peux citer les fichiers plus tard si vous voulez. –

Questions connexes