[LinqPad妙用]-在Net MVC中反射调用LinqPad中的Dump函数

时间:2022-11-09 08:01:49

LinqPad有个非常强大的Dump函数。这篇讲解一下如何将Dump函数应用在.Net MVC Web开发中。

先看效果:

[LinqPad妙用]-在Net MVC中反射调用LinqPad中的Dump函数

  

 一、用.Net Reflector反编译LinqPad.exe,找出Dump函数的定义:

  经过反编译发现,Dump函数调用了LINQPad.ObjectGraph.Formatters.XhtmlWriter类中FormatObject函数,把对象转成了Html。

[LinqPad妙用]-在Net MVC中反射调用LinqPad中的Dump函数

 二、反射调用FormatObject函数:

  由于FormatObject函数是protect类型,不能直接调用,只能反射了。
  [LinqPad妙用]-在Net MVC中反射调用LinqPad中的Dump函数

 三、在.Net MVC中使用Dump:

BigDump.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Reflection;
using System.IO;
using System.Text; namespace System.Web
{
public static class BigDump
{
private static MethodInfo dumpMethodInfo = null;
private static object xhtmlWriterInstance = null;
private static void Init()
{
if (dumpMethodInfo == null || xhtmlWriterInstance == null)
{
var asm = Assembly.LoadFile(HttpContext.Current.Server.MapPath("~/Lib/LINQPad.exe"));
Type t1 = asm.GetType("LINQPad.ObjectGraph.Formatters.XhtmlWriter");
ConstructorInfo t1Constructor = t1.GetConstructor(new Type[] { typeof(TextWriter), typeof(bool) });
xhtmlWriterInstance = t1Constructor.Invoke(new Object[] { new StringWriter(new StringBuilder()), false });
dumpMethodInfo = t1.GetMethod("FormatObject", BindingFlags.Instance | BindingFlags.NonPublic);
}
}
public static MvcHtmlString Render<T>(this T o, string description = "", int? depth = )
{
Init();
var result = dumpMethodInfo.Invoke(xhtmlWriterInstance, new Object[] { o, description, depth, new TimeSpan() });
return new MvcHtmlString(result as string);
} public static List<MvcHtmlString> Stack { get; set; }
static BigDump()
{
Stack = new List<MvcHtmlString>();
}
public static T Dump<T>(this T o, string description = "", int? depth = )
{
Stack.Add(o.Render(description, depth));
return o;
}
public static void Clear()
{
Stack = new List<MvcHtmlString>();
}
public static MvcHtmlString Flush()
{
var html = new MvcHtmlString(string.Join("\r\n", Stack.Select(r => r.ToHtmlString()).ToArray()));
Clear();
return html; }
}
}

[LinqPad妙用]-在Net MVC中反射调用LinqPad中的Dump函数的更多相关文章

  1. 在C&plus;&plus;中反射调用&period;NET(二)

    反射调用返回复杂对象的.NET方法 定义数据接口 上一篇在C++中反射调用.NET(一)中,我们简单的介绍了如何使用C++/CLI并且初步使用了反射调用.NET程序集的简单方法,今天我们看看如何在C+ ...

  2. 在C&plus;&plus;中反射调用&period;NET(一)

    为什么要在C++中调用.NET 一般情况下,我们常常会在.NET程序中调用C/C++的程序,使用P/Invoke方式进行调用,在编写代码代码的时候,首先要导入DLL文件,然后在根据C/C++的头文件编 ...

  3. 在C&plus;&plus;中反射调用&period;NET(三)

    在.NET与C++之间传输集合数据 上一篇<在C++中反射调用.NET(二)>中,我们尝试了反射调用一个返回DTO对象的.NET方法,今天来看看如何在.NET与C++之间传输集合数据. 使 ...

  4. 如何在c语言中源文件调用另一个源文件的函数

    在源文件A1.c中调用A2.c 中的函数有两种方法: 1.在A2.c中有完整的函数定义,在A1.c中添加一下要用到的函数原型(声明)就可以了,例如:在A2.c中:有函数void A2(){...};在 ...

  5. Java&lowbar;通过反射调用类中的方法

    先上一个基本的封装: /** * 获取classType * * @param type * @param provinceCode * @param cityCode * @return * @th ...

  6. 反射调用android系统级API函数

    try { Class<?> mClass = Class.forName("com.android.server.wifi.WifiSettingsStore"); ...

  7. 在VSTO界面中,调用xll中的函数

    最近研究各种有点迷茫了,原来Xll的加载宏直接可以在C#中调用的,我又各种Out了. 先说明一下,在VBA中,如何调用吧 XLLFound = Application.RegisterXLL(This ...

  8. Java SpringMvc&plus;hibernate架构中,调用Oracle中的sp,传递数组参数

    一.问题 我们调用数据,大都是可以直接获取表中的数据,或者用复杂点的sql语句组成的.但是,有时候,当这样达不到我们要的全部数据的时候,这时,我们就用到了存储过程[sp],如果sp需要参数是数组的话, ...

  9. Xamarin Android Webview中JS调用App中的C&num;方法

    参考链接:https://github.com/xamarin/recipes/tree/master/Recipes/android/controls/webview/call_csharp_fro ...

随机推荐

  1. 欧拉函数 cojs 2181&period; 打表

    cojs 2181. 打表 ★☆   输入文件:sendtable.in   输出文件:sendtable.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 有一道比赛题 ...

  2. Oracle导入导出之dmp

    Oracle导入导出有两种方式,分别是imp/exp与impdp/expdp. 1.imp/exp exp scott/tiger file=d:\test.dmp log=d:\test.log o ...

  3. Struts2:ValueStack

    一.ValueStack     1 .ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用       ...

  4. cocos2dx中的精灵CCSprite

    什么是精灵(CCSprite),在官网文档中是这么定义的 Sprites A cocos2d CCSprite is similar to sprites you find in other game ...

  5. OVS中arp响应的流表的实现

    总结: 1.br-int 流表总体是按照Normal 的方式,即常规的交换机的转发方式进行转发.而br-tun 交换机则主要按照流表的方式进行转发. 2.一般情况下,VM发出的ARP请求,会在该VM的 ...

  6. bat检测文件大小并邮件报警

    rem 获取当前日期 set TimeName=%date:~0,4%%date:~5,2%%date:~8,2% rem 获取文件名 set file=%TimeName%   rem 获取文件大小 ...

  7. dede&colon;list及dede&colon;arclist 按权重排序的方法

    有时我们需要做文章排名,比如指定第一名到第三名在前面,这样就用到这个权重排序方法.稍改下就可以完美支持.. dede:list 的方法 1 找到"根目录\include\arc.listvi ...

  8. Windows Server 2008 R2中无法使用360免费Wifi的解决方案

    为了使主机和虚拟机在同一个无线网络中,而虚拟机的系统是Windows Server 2008 R2 64位的,使用360免费wifi,始终无法开启.在网上查找解决方案,终于找到了原因:Windows ...

  9. 3、一、Introduction&lpar;入门&rpar;:2、Device Compatibility&lpar;设备兼容性&rpar;

    2.Device Compatibility(设备兼容性)   Android is designed to run on many different types of devices, from ...

  10. ios 获得通讯录中联系人的所有属性 亲测,可行 兼容io6 和 ios 7

    //获取通讯录中的所有属性,并存储在 textView 中,已检验,切实可行.兼容io6 和 ios 7 ,而且ios7还没有权限确认提示. -(void)getAddressBook { ABAdd ...