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

        }
    }
}
时间: 2024-10-29 19:05:44

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

在C++中反射调用.NET(二)

反射调用返回复杂对象的.NET方法 定义数据接口 上一篇在C++中反射调用.NET(一)中,我们简单的介绍了如何使用C++/CLI并且初步使用了反射调用.NET程序集的简单方法,今天我们看看如何在C++与.NET程序集之间传递复杂对象. 先看看.NET程序集的一个返回对象的方法: public IUserInfo GetUserByID(int userId) { IUserInfo userinfo= EntityBuilder.CreateEntity<IUserInfo>(); user

在UIWebView中间接调用网页中的javascript代码获得想要的值

日记和一些废话: 今天在使用webView加载网页后, 发现网页中的点击事件是用js代码实现的, 可是怎么点击都没有反应, 而且我主要是想获取到点击事件转到的url , 后来发现html中又这么一段代码: document.addEventListener('WebViewJavascriptBridgeReady', function onBridgeReady(event) function openPage(pageUrl) { if(bridge) { bridge.send(pageU

webview中js调用Android中的方法

package com.example.helloworld; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.webkit.WebView; public class MainActivity extends Activity { private WebView webView = null

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

在源文件A1.c中调用A2.c 中的函数有两种方法: 1.在A2.c中有完整的函数定义,在A1.c中添加一下要用到的函数原型(声明)就可以了,例如:在A2.c中:有函数void A2(){...};在A1.c中:在文件前头增加一行:void A2();就可以了 2.把A2.c中完整定义的函数的原型,写到一个A2.h文件中,然后在A1.c的文件头增加#include "A2.h"就可以了以上两种方法,在A1.c中都可以正常的调用,就跟在A2.c中调用一样. 其实函数默认是外部的,只要在其

在D语言中如何调用Windows中的COM控件

Windows中COM组件是Windows中重要组成部分,可以注册成系统公共组件,也可以不注册直接调用.在D语言中调用COM组件前,我们需要了解COM组件.COM组件都有一个公共的接口,使用IDL语言编写,使用mild.exe编译器编译后生成tlb格式文件,通常叫做类型库,在生成COM组件的DLL时,会把这个文件放在DLL的资源文件中,资源名称叫做TYPELIB        要调用COM组件,先需要知道COM组件的接口,因此可以先从dll中把类型库导出成IDL接口文件,再把IDL接口文件转化为

通过反射调用类中的方法

操作步骤: 1:实例化Class: 2:通过Class类的getMethod()方法取得一个Method的对象,并设置次方法操作时所需的参数类型: 3:使用invoke进行调用,并向方法中传递要设置的参数,但在使用invoke()方法时必须传入一个类的实例化对象 实例1:sayChina()方法中没有参数 package cn.itcast02; import java.lang.reflect.Method; //调用Person类中的sayChina()方法,没有参数 public clas

Java_通过反射调用类中的方法

先上一个基本的封装: /** * 获取classType * * @param type * @param provinceCode * @param cityCode * @return * @throws Exception */ public Class<?> getClassType(String type, String provinceCode, String cityCode, String suffix) throws Exception { Class<?> cl

反射调用android系统级API函数

try { Class<?> mClass = Class.forName("com.android.server.wifi.WifiSettingsStore"); Constructor con=mClass.getDeclaredConstructor(Context.class); if(!con.isAccessible()){ con.setAccessible(true); } Object store = con.newInstance(this); Met

Struts2中动态调用action中的方法失败的问题

解决方法: 在Struts.xml中添加该配置: <!-- 该配置设置为true可以调用动态方法 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" />