aboutsummaryrefslogtreecommitdiffstatsci
path: root/src/GraphicObjects
diff options
context:
space:
mode:
authorjpbruyere <jp.bruyere@hotmail.com>2016-02-05 11:20:36 +0100
committerjpbruyere <jp.bruyere@hotmail.com>2016-02-05 11:20:36 +0100
commitacfb21c78055c8294b885baba4756cb147c4c351 (patch)
treeec7b9840bb2b51c6973b42af76ed5ac9b1b7e1b4 /src/GraphicObjects
parent96bd9ab0c3f03018f90551e685d896bf1743fd36 (diff)
fix interface Reflexion in loop
Diffstat (limited to 'src/GraphicObjects')
-rw-r--r--src/GraphicObjects/GraphicObject.cs21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/GraphicObjects/GraphicObject.cs b/src/GraphicObjects/GraphicObject.cs
index f32ac30e..8d4ec675 100644
--- a/src/GraphicObjects/GraphicObject.cs
+++ b/src/GraphicObjects/GraphicObject.cs
@@ -916,13 +916,21 @@ namespace Crow
MethodInfo stringEquals = typeof(string).GetMethod
("Compare", new Type[3] {typeof(string), typeof(string), typeof(StringComparison)});
+ Type sourceType = this.GetType();
+ EventInfo ei = typeof(IValueChange).GetEvent("ValueChanged");
+ MethodInfo evtInvoke = ei.EventHandlerType.GetMethod ("Invoke");
+ ParameterInfo[] evtParams = evtInvoke.GetParameters ();
+ Type handlerArgsType = evtParams [1].ParameterType;
+ Type[] args = {typeof(object), typeof(object),handlerArgsType};
+ FieldInfo fiNewValue = typeof(ValueChangeEventArgs).GetField("NewValue");
+ FieldInfo fiMbName = typeof(ValueChangeEventArgs).GetField("MemberName");
+
//group;only one dynMethods by target (valuechanged event source)
//changed value name tested in switch
IEnumerable<Binding[]> groupedByTarget = resolved.GroupBy (g => g.Target.Instance, g => g, (k, g) => g.ToArray ());
foreach (Binding[] grouped in groupedByTarget) {
int i = 0;
Type targetType = grouped[0].Target.Instance.GetType();
- Type sourceType = this.GetType();
DynamicMethod dm = null;
ILGenerator il = null;
@@ -931,14 +939,9 @@ namespace Crow
System.Reflection.Emit.Label endMethod = new System.Reflection.Emit.Label();
#region Retrieve EventHandler parameter type
- EventInfo ei = targetType.GetEvent ("ValueChanged");
+ //EventInfo ei = targetType.GetEvent ("ValueChanged");
//no dynamic update if ValueChanged interface is not implemented
- if (ei != null){
- MethodInfo evtInvoke = ei.EventHandlerType.GetMethod ("Invoke");
- ParameterInfo[] evtParams = evtInvoke.GetParameters ();
- Type handlerArgsType = evtParams [1].ParameterType;
-
- Type[] args = {typeof(object), typeof(object),handlerArgsType};
+ if (targetType.GetInterfaces().Contains(typeof(IValueChange))){
dm = new DynamicMethod(grouped[0].NewDynMethodId,
MethodAttributes.Family | MethodAttributes.FamANDAssem | MethodAttributes.NewSlot,
CallingConventions.Standard,
@@ -960,12 +963,10 @@ namespace Crow
//il.Emit(OpCodes.Isinst, sourceType);
//push new value onto stack
il.Emit(OpCodes.Ldarg_2);
- FieldInfo fiNewValue = typeof(ValueChangeEventArgs).GetField("NewValue");
il.Emit(OpCodes.Ldfld, fiNewValue);
il.Emit(OpCodes.Stloc_1);
//push name
il.Emit(OpCodes.Ldarg_2);
- FieldInfo fiMbName = typeof(ValueChangeEventArgs).GetField("MemberName");
il.Emit(OpCodes.Ldfld, fiMbName);
il.Emit(OpCodes.Stloc_0);
il.Emit(OpCodes.Ldloc_0);