Ejemplo n.º 1
0
		/// <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
         });
     }
 }
Ejemplo n.º 3
0
 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
         });
     }
 }
Ejemplo n.º 5
0
        internal static IInvokeMethod GetMethodInvokerWrapper(MethodInfo methodInfo)
        {
            IInvokeMethod method = (IInvokeMethod)s_dict[methodInfo];

            if (method == null)
            {
                method             = CreateMethodInvokerWrapper(methodInfo);
                s_dict[methodInfo] = method;
            }

            return(method);
        }
Ejemplo n.º 6
0
        /// <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);
        }