在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

posted on 2009-05-20 15:53  PetterLiu  阅读(3756)  评论(5编辑  收藏  举报