zoukankan      html  css  js  c++  java
  • Asp.netMVC中通过反射获取Controller的相关信息

      在ASP.NET MVC开发中,通常有很多Controller,Action.我们可以从外面以反射,Linq的语法来获取些信息.Linq语法使得代码可读性高.
    看UnitTest:

        /// <summary>
        /// Tests the get info from controller.
        /// </summary>
        /// <remarks>http://wintersun.cnblogs.com </remarks>
        [TestMethod]
        public void TestGetInfoFromController()
        {
            var controllers =
    from t in GetAllControllerTypes()
    where typeof(Controller).IsAssignableFrom(t) && !t.IsAbstract
    orderby t.FullName
    from m in t.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)
    where !m.IsSpecialName
    select new { ControllerName = FormatControllerName(t.FullName), ActionName = m.Name, Params = m.GetParameters() };
    
    
            controllers.ToList().ForEach(c => Debug.WriteLine(string.Format("Controller: {0}, Action: {1}({2})",
                                                                            c.ControllerName, c.ActionName,
                                                                            string.Join(", ",
                                                                                        c.Params.Select(p => p.Name).
                                                                                            ToArray()))));
            Debug.WriteLine(string.Format("Controller/action count: {0}", controllers.Count()));
            Debug.WriteLine(string.Format("Controller count: {0}", controllers.GroupBy(c => c.ControllerName).Count()));
          
        }
    
        /// <summary>
        /// Gets all controller types.
        /// </summary>
        /// <returns>all types in an assembly where my controllers can be found</returns>
        private static Type[] GetAllControllerTypes()
        {
            return typeof(ProductManageController).Assembly.GetTypes();
        }
    
        /// <summary>
        /// Formats the name of the controller,remove all of the namespace information from the controller names
        /// </summary>
        /// <param name="typeName">Name of the type.</param>
        /// <returns></returns>
        private static string FormatControllerName(string typeName)
        {
            return typeName.Replace("Demo1Web.", string.Empty).Replace("Controllers.", string.Empty);
        }

    上面代码将输出:

    Controller: HomeController, Action: Index()
    Controller: HomeController, Action: test()
    Controller: HomeController, Action: ThisActionHasProblem()
    Controller: HomeController, Action: Category(form)
    Controller: ProductManageController, Action: Delete(ProductId)
    Controller: ProductManageController, Action: DeleteSome(form)
    Controller: ProductManageController, Action: EditProduct(Id)
    Controller: ProductManageController, Action: ProductList(id)
    Controller: ProductManageController, Action: QueryAllProducts(id, form)
    Controller: ProductManageController, Action: SaveByBinder(productId, product)
    Controller: ProductManageController, Action: Save(ProductId, form)
    Controller: ProductManageController, Action: ViewProduct(Id)
    Controller/action count: 12
    Controller count: 2

    1 passed, 0 failed, 0 skipped, took 0.97 seconds (NUnit_VSTS).

    清晰的列表,有趣吧.

    Author: Petter Liu    http://wintersun.cnblogs.com

  • 相关阅读:
    软测试-计算机组成原理、系统和网络安全机构
    POJ 2044 Weather Forecast
    Cocos2d-x 3.x 头像选择,本地相册图片+图片编辑(Android、IOS双平台)
    Spring-----1、Spring一个简短的引论
    捕android程序崩溃日志
    java 正则表达式例子, 查找字符串
    java中Pattern.compile函数的相关解释
    java JdbcTemplate源码
    eclipse 常用快捷键整理
    java 正则表达式去除标点符号
  • 原文地址:https://www.cnblogs.com/wintersun/p/1468208.html
Copyright © 2011-2022 走看看