使用c#反射實現接口可視化調試頁面


直接上代碼,引用CommTools.dll、包括aspx顯示頁面和aspx.cs獲取反射數據源代碼

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.UI;
 6 using System.Web.UI.WebControls;
 7 using CommTools;
 8 
 9 namespace WebAppReflector
10 {
11     public partial class WebForm1 : System.Web.UI.Page
12     {
13         protected void Page_Load(object sender, EventArgs e)
14         {
15             const string NameSpace = "CommTools";
16 
17             //獲取CommTools.WebUtils的方法,包括get,set
18             var ass = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(t => t.FullName.Contains(NameSpace));
19             if (ass == null) { Response.Write("no assembly"); return; }
20             var methods = ass.GetType(string.Format("{0}.{1}", NameSpace, "WebUtils")).GetMethods();
21             ddlMethds.DataSource = methods;
22             ddlMethds.DataBind();
23 
24             //獲取CommTools.WebUtils的屬性
25             var members = ass.GetType(string.Format("{0}.{1}", NameSpace, "WebUtils")).GetProperties();
26             ddlMembers.DataSource = members;
27             ddlMembers.DataBind();
28 
29             //獲取方法(CommTools.WebUtils類的Get<T>)的請求參數名、類型、返回值類型,public static T Get<T>(string url)
30             var thisMethod = methods.FirstOrDefault(t => t.Name == "Get");
31             var reqParams = thisMethod.GetParameters();
32             ddlParams.Items.AddRange(reqParams.Select(t => new ListItem(t.Name + "|" + t.ParameterType.Name)).ToArray());
33             Response.Write("返回值類型" + thisMethod.ReturnType.ToString() + "<br/>");  //empty:thisMethod.ReturnParameter.Name
34             
35         }
36     }
37 }
View Code
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.UI;
 6 using System.Web.UI.WebControls;
 7 using CommTools;
 8 
 9 namespace WebAppReflector
10 {
11     public partial class WebForm1 : System.Web.UI.Page
12     {
13         protected void Page_Load(object sender, EventArgs e)
14         {
15             const string NameSpace = "CommTools";
16 
17             //獲取CommTools.WebUtils的方法,包括get,set
18             var ass = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(t => t.FullName.Contains(NameSpace));
19             if (ass == null) { Response.Write("no assembly"); return; }
20             var methods = ass.GetType(string.Format("{0}.{1}", NameSpace, "WebUtils")).GetMethods();
21             ddlMethds.DataSource = methods;
22             ddlMethds.DataBind();
23 
24             //獲取CommTools.WebUtils的屬性
25             var members = ass.GetType(string.Format("{0}.{1}", NameSpace, "WebUtils")).GetProperties();
26             ddlMembers.DataSource = members;
27             ddlMembers.DataBind();
28 
29             //獲取方法(CommTools.WebUtils類的Get<T>)的請求參數名、類型、返回值類型,public static T Get<T>(string url)
30             var thisMethod = methods.FirstOrDefault(t => t.Name == "Get");
31             var reqParams = thisMethod.GetParameters();
32             ddlParams.Items.AddRange(reqParams.Select(t => new ListItem(t.Name + "|" + t.ParameterType.Name)).ToArray());
33             Response.Write("返回值類型" + thisMethod.ReturnType.ToString() + "<br/>");  //empty:thisMethod.ReturnParameter.Name
34 
35             //計算並顯示toMD5(123)
36             var aMethod = ass.GetType(string.Format("{0}.{1}", NameSpace, "StringOpertion")).GetMethod("toMD5");
37             object rspEntity = aMethod.Invoke(null, new[] { "123" });
38             Response.Write("toMD5(123):" + rspEntity + "<br/>");
39             
40         }
41     }
42 }
View Code

 

利用反射,可獲取某個程序集內部的所有方法、每個方法的參數、類型等。結合html 控件唯一命名,進行http get或post請求傳參數,完全可以做個接口可視化調試頁面。

主要思路:獲取dll內部的多個方法、綁定顯示=》選擇某方法,獲取該方法內部的屬性,以唯一html id顯示(簡單類型直接顯示txt,bool、枚舉顯示ddl,復雜類型顯示答大文本框,給使用者填寫json),對於實體注釋讀取注釋xml=》人工賦值后提交,對請求參數使用反射賦值(對於不同類型不同賦值方式),后可以本地直接dll調用、也可以遠程http json請求=》獲得結果直接json序列化顯示

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM