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 :
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 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)
J'ai essayé cela :
Mais lors du SetValue de la propriété j'ai le message suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 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
"System.Security.VerificationException: Cette opération pourrait déstabiliser le runtime " & vbCrLf & " à DynamicClass1.set_Gal_ID(Nullable`1 )}"
Merci de m'éclairer...
Partager