首页 > 代码库 > [LinqPad妙用]-在Net MVC中反射调用LinqPad中的Dump函数

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

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

先看效果:

  

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

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

 

 二、反射调用FormatObject函数:

  由于FormatObject函数是protect类型,不能直接调用,只能反射了。
  

 三、在.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 = 3)        {            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 = 3)        {            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函数