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

  • 相关阅读:
    java 微信公众号素材 新增其他类型永久素材
    @schedule
    idea 打包的jar运行报 “XXX中没有主清单属性”
    openjdk没有ssl支持的相关证书包,导致使用HTPPS调用第三方接口时候报错误 InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
    查询端口是否开通
    企业微信-之无法修改成员手机号
    PostgreSQL使用distinct关键字给单独的几列去重
    centos全屏幕退出:Alt+Enter
    github上OC 和swift框架精选
    github每日精选---iOS版
  • 原文地址:https://www.cnblogs.com/wintersun/p/1468208.html
Copyright © 2011-2022 走看看