C#獲取類以及類下的方法(用於Asp.Net MVC)


在開發MVC項目中遇到的問題,做權限控制時,通過MVC的過濾器來實現,所以在分配權限時希望獲取到所有的控制器和Action方法,通過查找資料,參考了《Asp.Net MVC框架揭秘》,最終實現。

在C#中,實現動態獲取類和方法主要通過反射來實現,要引用System.Reflection。

public ActionResult GetControllerAndAction()
      List<Type> controllerTypes = new List<Type>();    //創建控制器類型列表
   var assembly = Assembly.Load("MySoft.UI");    //加載程序集
   controllerTypes.AddRange(assembly.GetTypes().Where(type => typeof(IController).IsAssignableFrom(type) && type.Name!="ErrorController"));    //獲取程序集下所有的類,通過Linq篩選繼承IController類的所有類型
   StringBuilder jsonBuilder = new StringBuilder();    //創建動態字符串,拼接json數據    注:現在json類型傳遞數據比較流行,比xml簡潔
   jsonBuilder.Append("[");
   foreach (var controller in controllerTypes)//遍歷控制器類
   {
       jsonBuilder.Append("{\"controllerName\":\"");
      jsonBuilder.Append(controller.Name);
       jsonBuilder.Append("\",\"controllerDesc\":\"");
       jsonBuilder.Append((controller.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute)==null?"" : (controller.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute).Description);    //獲取對控制器的描述Description
       jsonBuilder.Append("\",\"action\":[");
       var actions = controller.GetMethods().Where(method => method.ReturnType.Name == "ActionResult");    //獲取控制器下所有返回類型為ActionResult的方法,對MVC的權限控制只要限制所以的前后台交互請求就行,統一為ActionResult
       foreach (var action in actions)
       {
           jsonBuilder.Append("{\"actionName\":\"");
           jsonBuilder.Append(action.Name);
           jsonBuilder.Append("\",\"actionDesc\":\"");
           jsonBuilder.Append((action.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute) == null ? "" : (action.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute).Description);    //獲取對Action的描述
           jsonBuilder.Append("\"},");
       }
       jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
       jsonBuilder.Append("]},");
   }
   jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
   jsonBuilder.Append("]");
       return Content(jsonBuilder.ToString(),"json/text");t"); 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM