• 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

  • 相关阅读:
    学习数据结构基础
    epoll
    pthread_create
    设置套接字选项
    5中I/O模型
    数据仓库一些整理(列式数据库)
    mysql分区方案的研究
    订单表的分库分表方案设计(大数据)
    从源码角度理清memcache缓存服务
    性能,不是不重要,而是,它没有可维护性重要
  • 原文地址:https://www.cnblogs.com/wintersun/p/1468208.html
Copyright © 2020-2023  润新知