使用c#反射实现接口可视化调试页面

Posted nlh774

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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序列化显示

 

以上是关于使用c#反射实现接口可视化调试页面的主要内容,如果未能解决你的问题,请参考以下文章

C#通过反射接口可以实例化??

是否可以动态编译和执行 C# 代码片段?

C# WPF通过反射及Ioc容器综合实例

调试位于 nuget 包中的 C# 接口实现

如何在 C# 中使用反射获取类型的完全限定名称

c# 简单实现 插件模型 反射方式