diff options
| author | jpbruyere <jp.bruyere@hotmail.com> | 2016-08-22 13:41:50 +0200 |
|---|---|---|
| committer | jpbruyere <jp.bruyere@hotmail.com> | 2016-09-01 13:24:17 +0200 |
| commit | a4555b5e71ff4fc8ed89396d02218694230d1292 (patch) | |
| tree | 41f390a191a02db2748d9ec1aca5489e93115535 /src/CompilerServices | |
| parent | 8b3cd65ebab46402ebc0662de3c9ead220f6322c (diff) | |
search extension methods for expand delegate
move recurent MemberInfo to global static.
modifié : src/CompilerServices/CompilerServices.cs
modifié : src/IMLReader.cs
modifié : src/ItemTemplate.cs
Diffstat (limited to 'src/CompilerServices')
| -rw-r--r-- | src/CompilerServices/CompilerServices.cs | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/src/CompilerServices/CompilerServices.cs b/src/CompilerServices/CompilerServices.cs index 7a73574b..26a185ed 100644 --- a/src/CompilerServices/CompilerServices.cs +++ b/src/CompilerServices/CompilerServices.cs @@ -16,6 +16,18 @@ namespace Crow static FieldInfo miSetCurIface = typeof(GraphicObject).GetField ("currentInterface", BindingFlags.NonPublic | BindingFlags.Instance); + #region ValueChange Reflexion member info + static MethodInfo stringEquals = typeof (string).GetMethod + ("Equals", new Type [3] { typeof (string), typeof (string), typeof (StringComparison) }); + static EventInfo eiValueChange = typeof (IValueChange).GetEvent ("ValueChanged"); + static MethodInfo miInvokeValueChange = eiValueChange.EventHandlerType.GetMethod ("Invoke"); + static Type [] argsValueChange = { typeof (object), typeof (object), miInvokeValueChange.GetParameters () [1].ParameterType }; + static FieldInfo fiNewValue = typeof (ValueChangeEventArgs).GetField ("NewValue"); + static FieldInfo fiMbName = typeof (ValueChangeEventArgs).GetField ("MemberName"); + static MethodInfo miValueChangeAdd = eiValueChange.GetAddMethod (); + #endregion + + public static void emitSetCurInterface(ILGenerator il){ il.Emit (OpCodes.Ldloc_0); il.Emit (OpCodes.Ldarg_1); @@ -196,16 +208,7 @@ namespace Crow b.Resolved = true; } - MethodInfo stringEquals = typeof (string).GetMethod - ("Equals", new Type [3] { typeof (string), typeof (string), typeof (StringComparison) }); Type target_Type = Bindings [0].Source.Instance.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 @@ -228,7 +231,7 @@ namespace Crow MethodAttributes.Family | MethodAttributes.FamANDAssem | MethodAttributes.NewSlot, CallingConventions.Standard, typeof (void), - args, + argsValueChange, target_Type, true); il = dm.GetILGenerator (256); @@ -376,9 +379,8 @@ namespace Crow il.Emit (OpCodes.Pop); il.Emit (OpCodes.Ret); - Delegate del = dm.CreateDelegate (ei.EventHandlerType, Bindings [0].Source.Instance); - MethodInfo addHandler = ei.GetAddMethod (); - addHandler.Invoke (grouped [0].Target.Instance, new object [] { del }); + Delegate del = dm.CreateDelegate (eiValueChange.EventHandlerType, Bindings [0].Source.Instance); + miValueChangeAdd.Invoke (grouped [0].Target.Instance, new object [] { del }); } } @@ -589,6 +591,17 @@ namespace Crow return query; } + + public static MethodInfo SearchExtMethod(Type t, string methodName){ + MethodInfo mi = null; + mi = GetExtensionMethods (Assembly.GetEntryAssembly(), t) + .Where (em => em.Name == methodName).FirstOrDefault (); + if (mi != null) + return mi; + + return GetExtensionMethods (Assembly.GetExecutingAssembly(), t) + .Where (em => em.Name == methodName).FirstOrDefault (); + } } } |