/// <summary> /// 刷新VBA方法列表 /// </summary> protected void RefreshMethodList() { myVBAMethods.Clear(); System.Reflection.Assembly myAssembly = this.Assembly; foreach (object obj in this.Items) { if (obj is Microsoft.Vsa.IVsaCodeItem) { Microsoft.Vsa.IVsaCodeItem CodeItem = (Microsoft.Vsa.IVsaCodeItem)obj; System.Type t = myAssembly.GetType(this.RootNamespace + "." + CodeItem.Name); System.Reflection.MethodInfo[] ms = t.GetMethods(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static); foreach (System.Reflection.MethodInfo m in ms) { VBAScriptMethodItem MethodItem = new VBAScriptMethodItem(); myVBAMethods.Add(MethodItem); MethodItem.ModuleName = CodeItem.Name; MethodItem.MethodName = m.Name; MethodItem.MethodObject = m; MethodItem.ReturnType = m.ReturnType; if (m.GetParameters().Length == 0) { System.Type dt = SlowAndSteadyParser.DelegateHelper.GetDelegateType(m.ReturnType); if (dt != null) { MethodItem.MethodDelegate = System.Delegate.CreateDelegate(dt, m); } } } //foreach } } }
/// <summary> /// 无参数的执行指定名称的脚本方法并返回方法返回值,模块名称和方法名称不区分大小写 /// </summary> /// <param name="ModuleName">模块名称</param> /// <param name="MethodName">方法</param> /// <returns>若执行成功则返回方法返回值,否则返回空引用</returns> public object RunScriptMethod(string ModuleName, string MethodName) { VBAScriptMethodItem MethodItem = GetMethodItem(ModuleName, MethodName); if (MethodItem == null || MethodItem.MethodDelegate == null) { return(null); } else { return(MethodItem.MethodDelegate.DynamicInvoke(null)); } }
/// <summary> /// 获得指定名称的脚本方法对象,方法名称不区分大小写 /// </summary> /// <param name="MethodName">方法名称</param> /// <returns>脚本方法对象</returns> public System.Reflection.MethodInfo GetScriptMethod(string MethodName) { VBAScriptMethodItem MethodItem = GetMethodItem(null, MethodName); if (MethodItem == null) { return(null); } else { return(MethodItem.MethodObject); } }
/// <summary> /// 无参数的执行指定模块指定名称代码方法并返回布尔值,模块名称和方法名称不区分大小写 /// 若方法不存在或执行错误则返回默认值 /// </summary> /// <param name="ModuleName">模块名称</param> /// <param name="MethodName">方法名称</param> /// <param name="DefaultValue">默认值</param> /// <returns>执行结果</returns> public bool GetScriptBooleanValue(string ModuleName, string MethodName, bool DefaultValue) { if (this.bolEnable) { VBAScriptMethodItem MethodItem = GetMethodItem(ModuleName, MethodName); if (MethodItem != null && MethodItem.MethodDelegate != null) { try { return(Convert.ToBoolean(MethodItem.MethodDelegate.DynamicInvoke(null))); } catch {} } } return(DefaultValue); }
/// <summary> /// 无参数的执行指定模块指定名称的脚本方法并返回方法返回值,模块名称和方法名称不区分大小写 /// </summary> /// <param name="ModuleName">模块名称</param> /// <param name="MethodName">方法名称</param> /// <param name="obj">调用的对象</param> /// <param name="Parameters">参数数组</param> /// <returns>若执行成功则返回方法返回值,否则返回空引用</returns> public object RunScriptMethod(string ModuleName, string MethodName, object obj, object[] Parameters) { VBAScriptMethodItem MethodItem = GetMethodItem(ModuleName, MethodName); if (MethodItem == null) { return(null); } else { if (MethodItem.MethodDelegate != null) { return(MethodItem.MethodDelegate.DynamicInvoke(null)); } else { return(MethodItem.MethodObject.Invoke(obj, Parameters)); } } }
/// <summary> /// 刷新VBA方法列表 /// </summary> protected void RefreshMethodList() { myVBAMethods.Clear(); System.Reflection.Assembly myAssembly = this.Assembly ; foreach( object obj in this.Items ) { if( obj is Microsoft.Vsa.IVsaCodeItem ) { Microsoft.Vsa.IVsaCodeItem CodeItem = ( Microsoft.Vsa.IVsaCodeItem ) obj ; System.Type t = myAssembly.GetType( this.RootNamespace + "." + CodeItem.Name ); System.Reflection.MethodInfo[] ms = t.GetMethods( System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static ); foreach( System.Reflection.MethodInfo m in ms ) { VBAScriptMethodItem MethodItem = new VBAScriptMethodItem(); myVBAMethods.Add( MethodItem ); MethodItem.ModuleName = CodeItem.Name ; MethodItem.MethodName = m.Name ; MethodItem.MethodObject = m ; MethodItem.ReturnType = m.ReturnType ; if( m.GetParameters().Length == 0 ) { System.Type dt = SlowAndSteadyParser.DelegateHelper.GetDelegateType( m.ReturnType ); if( dt != null) MethodItem.MethodDelegate = System.Delegate.CreateDelegate( dt , m ); } }//foreach } } }