[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;

        }
    }
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。