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 :

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

J'ai essayé cela :

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
Mais lors du SetValue de la propriété j'ai le message suivant :
"System.Security.VerificationException: Cette opération pourrait déstabiliser le runtime " & vbCrLf & " à DynamicClass1.set_Gal_ID(Nullable`1 )}"

Merci de m'éclairer...