none
Reflection emit : Injection appel fonction dans setter RRS feed

  • Discussion générale

  • Bonjour,

    J'utilise la Reflection pour injecter dans un setter le code permettant de gérer la notification (INotifyPropertyChanged), et cela fonctionne très bien :

    genSet.Emit(OpCodes.Ldarg_0)
    genSet.Emit(OpCodes.Ldarg_1)
    genSet.Emit(OpCodes.Stfld, fb)
    genSet.Emit(OpCodes.Nop)
    genSet.Emit(OpCodes.Ldarg_0)
    genSet.Emit(OpCodes.Ldstr, dp.Name)
    
    Dim propertyChange = GetType(Dynamic.DynamicClass).GetMethod("RaisePropertyChange", New Type() {GetType(String)})
    genSet.Emit(OpCodes.Call, propertyChange)
    genSet.Emit(OpCodes.Nop)
    genSet.Emit(OpCodes.Ret)
    pb.SetGetMethod(mbGet)
    pb.SetSetMethod(mbSet)

    Maintenant je souhaiterai intercaler une condition permettant de faire le setter et l'appel à "RaisePropertyChange" que si la valeur passée au setter est réellement différente de la valeur en cours.

    Des idées ?

    Merci

    mercredi 25 novembre 2015 08:49

Toutes les réponses

  • J'ai essayé le code suivant, mais lors du setvalue de la proprité ça plante :

    {System.Security.VerificationException: Cette opération pourrait déstabiliser le runtime " & vbCrLf & "   à DynamicClass1.set_Gal_ID(Nullable`1 )}

    Voici le code :

    Dim mfalse As Label = genSet.DefineLabel()
    
    genSet.Emit(OpCodes.Nop)
    genSet.Emit(OpCodes.Ldarg_1)
    genSet.Emit(OpCodes.Ldarg_0)
    genSet.Emit(OpCodes.Ldfld, fb)
    genSet.Emit(OpCodes.Ceq)
    genSet.Emit(OpCodes.Ldc_I4_0)
    genSet.Emit(OpCodes.Ceq)
    genSet.Emit(OpCodes.Stloc_1)
    genSet.Emit(OpCodes.Ldloc_1)
    genSet.Emit(OpCodes.Brfalse_S, mfalse)
    
    genSet.Emit(OpCodes.Ldarg_0)
    genSet.Emit(OpCodes.Ldarg_1)
    genSet.Emit(OpCodes.Stfld, fb)
    
    Dim propertyChange = GetType(Dynamic.DynamicClass).GetMethod("RaisePropertyChange", New Type() {GetType(String)})
    
    genSet.Emit(OpCodes.Ldarg_0)
    genSet.Emit(OpCodes.Ldfld, propertyChange)          
    
    genSet.Emit(OpCodes.Stloc_0)
    genSet.Emit(OpCodes.Ldloc_0) 
    genSet.Emit(OpCodes.Ceq)
    genSet.Emit(OpCodes.Stloc_1) 
    genSet.Emit(OpCodes.Ldloc_1)
    genSet.Emit(OpCodes.Brfalse_S, mfalse)
    genSet.Emit(OpCodes.Ldloc_0)
    genSet.Emit(OpCodes.Ldarg_0)
    genSet.Emit(OpCodes.Ldstr, dp.Name)
    
    genSet.Emit(OpCodes.Call, propertyChange)
    
    genSet.Emit(OpCodes.Nop)
    genSet.MarkLabel(mfalse)
    genSet.Emit(OpCodes.Nop)
    genSet.Emit(OpCodes.Nop)
    
    genSet.Emit(OpCodes.Ret)
    pb.SetGetMethod(mbGet)
    pb.SetSetMethod(mbSet)
    
    fields(i) = fb
    Merci



    • Modifié jsgy mercredi 25 novembre 2015 14:04
    mercredi 25 novembre 2015 14:02