透過MethodBase.Invoke方式,呼叫程式Funciton

  • 312
  • 0

摘要:透過MethodBase.Invoke方式,呼叫程式Funciton

背景:

Boss要我寫一個功能,要讓其它PG可以在某個專案裡面寫很多很多的報表Service,

這些Service會回傳byte[],如此一來,對於Web程式來說只要呼叫Service就可以Downlaod

資料,而且,batch Job也可以藉由呼叫該service寫到某實體目錄或者網路硬碟(MVC!?),問題來了,

因為這些Service是unknow的,所以我們會把要呼叫的Service Function Name寫在DB裡面,新增

service完畢的時候當然也免不了要去維護程式裡面設定一下要新增的報表資訊,如:Funciton Name...等。

當batch Job執行時直接讀取DB欄位去呼叫該Service Function,因此我們會用到MethodBase的方法。

 

步驟如下:

Step1:啟用Task讀取DB,知道我們要呼叫 Func1,Func2,....FuncN。

Step2:呼叫某A方案裡面的某Function

         e.g. AppService>service>ReportService.cs> Func1

         public virtual byte[] Func1(RptModel parameter, ref string contenttype)

         {.........}

Step3:寫入檔案

 

//說明

Step1讀取Funciton Name的步驟只是簡單的讀取DB,因此就忽略不說。

重點 Step2:

                //Call Service

                Type magicType = Type.GetType("App.service.ReportService"); //namespace+Class Name
                ConstructorInfo magicConstructor = magicType.GetConstructor(Type.EmptyTypes);
                object magicClassObject = magicConstructor.Invoke(new object[] { });
                MethodInfo magicMethod = magicType.GetMethod("Func1"); // Function Name
                List<object> ls_obj=new List<object>(); //Function 參數
                ls_obj.Add(cond);
                
                object magicValue = magicMethod.Invoke(magicClassObject, ls_obj.ToArray());
 

Step3: 抓取資料,並寫入實體資料夾

               var data = (byte[])magicValue; //取資料

                if (data.Length > 0)  //寫檔

                    File.WriteAllBytes(System.AppDomain.CurrentDomain.BaseDirectory +parameter.ExportName, data);
 

參考url: https://msdn.microsoft.com/zh-tw/library/a89hcwhh(v=vs.110).aspx