/// <summary> /// 根据指定的MethodInfo以及参数数组,快速调用相关的方法。 /// </summary> /// <param name="methodInfo">MethodInfo实例成员</param> /// <param name="obj">目标实例成员</param> /// <param name="parameters">函数参数</param> /// <returns>调用结果</returns> public static object FastInvoke(this MethodInfo methodInfo, object obj, params object[] parameters) { if( methodInfo == null ) throw new ArgumentNullException("methodInfo"); IInvokeMethod method = MethodInvokerFactory.GetMethodInvokerWrapper(methodInfo); return method.Invoke(obj, parameters); }
public void EventDefinedBarToggleSwitchItem_CheckedChanged(object sender, ItemClickEventArgs e) { if (!string.IsNullOrEmpty(this.ChangeMethodName)) { IInvokeMethod service = ServiceContainer.CreateInstance().Resolve <IInvokeMethod>("InvokeMethodService"); service.Invoke(this.ChangeMethodName, new object[1] { sender }); } }
public void button_ItemClick(object sender, ItemClickEventArgs e) { if (!string.IsNullOrEmpty(this.ItemClickMethodName)) { IInvokeMethod service = ServiceContainer.CreateInstance().Resolve <IInvokeMethod>("InvokeMethodService"); service.Invoke(this.ItemClickMethodName, new object[1] { sender }); } }
public void EventDefinedSkinRibbonGalleryBarItem_ItemClick(object sender, ItemClickEventArgs e) { if (!string.IsNullOrEmpty(this.MouseClickMethodName)) { IInvokeMethod service = ServiceContainer.CreateInstance().Resolve <IInvokeMethod>("InvokeMethodService"); service.Invoke(this.MouseClickMethodName, new object[1] { sender }); } }
internal static IInvokeMethod GetMethodInvokerWrapper(MethodInfo methodInfo) { IInvokeMethod method = (IInvokeMethod)s_dict[methodInfo]; if (method == null) { method = CreateMethodInvokerWrapper(methodInfo); s_dict[methodInfo] = method; } return(method); }
/// <summary> /// 根据指定的MethodInfo对象创建相应的IInvokeMethod实例。 /// </summary> /// <param name="method"></param> /// <returns></returns> public static IInvokeMethod CreateMethodInvokerWrapper(MethodInfo method) { // 在这个类型的静态构造方法中,我已将所有能优化反射调用的泛型找出来,保存在s_genericTypeDefinitions中。 // 这个工厂方法将根据: // 1. 方法是否有返回值, // 2. 方法是静态的,还是实例的, // 3. 方法有多少个参数 // 来查找能优化指定方法的那个泛型类型。 // 不过,s_genericTypeDefinitions保存的泛型定义,属于开放泛型, // 工厂方法还要根据指定方法来填充类型参数,最后创建特定的泛型实例。 if (method == null) { throw new ArgumentNullException("method"); } ParameterInfo[] pameters = method.GetParameters(); // 1. 首先根据指定方法的签名计算缓存键值 string key = null; if (method.ReturnType == typeof(void)) { if (method.IsStatic) { if (pameters.Length == 0) { key = "StaticActionWrapper"; } else { key = "StaticActionWrapper`" + pameters.Length.ToString(); } } else { key = "ActionWrapper`" + (pameters.Length + 1).ToString(); } } else { if (method.IsStatic) { key = "StaticFunctionWrapper`" + (pameters.Length + 1).ToString(); } else { key = "FunctionWrapper`" + (pameters.Length + 2).ToString(); } } // 2. 查找缓存,获取泛型定义 Type genericTypeDefinition; if (s_genericTypeDefinitions.TryGetValue(key, out genericTypeDefinition) == false) { // 如果找不到一个泛型类型,就返回下面这个通用的类型。 // 下面这个类型将不会优化反射调用。 return(new CommonInvokerWrapper(method)); } Type instanceType = null; if (genericTypeDefinition.IsGenericTypeDefinition) { // 3. 获取填充泛型定义的类型参数。 List <Type> list = new List <Type>(pameters.Length + 2); if (method.IsStatic == false) { list.Add(method.DeclaringType); } for (int i = 0; i < pameters.Length; i++) { list.Add(pameters[i].ParameterType); } if (method.ReturnType != typeof(void)) { list.Add(method.ReturnType); } // 4. 将泛型定义转成封闭泛型。 instanceType = genericTypeDefinition.MakeGenericType(list.ToArray()); } else { instanceType = genericTypeDefinition; } // 5. 实例化IReflectMethod对象。 IInvokeMethod instance = (IInvokeMethod)Activator.CreateInstance(instanceType); IBindMethod binder = instance as IBindMethod; if (binder != null) { binder.BindMethod(method); } return(instance); }