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

        }
    }
}

转载于:https://www.cnblogs.com/linqpad/p/4143824.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值