Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法通过ASP.NET MVC3管道获取控制器类型?_C#_Asp.net Mvc 3_Reflection - Fatal编程技术网

C# 有没有办法通过ASP.NET MVC3管道获取控制器类型?

C# 有没有办法通过ASP.NET MVC3管道获取控制器类型?,c#,asp.net-mvc-3,reflection,C#,Asp.net Mvc 3,Reflection,我需要获得另一个控制器上的属性(即,不是当前正在执行的控制器) 一种方法如下: Type controllerType = Type.GetType("App1.UI.Web.Controllers." + controllerName + "Controller", true); object[] controllerAttributes = controllerType.GetCustomAttributes(true); 有没有更好的、不那么脆弱的方法来使用MVC管道实现

我需要获得另一个控制器上的属性(即,不是当前正在执行的控制器)

一种方法如下:

    Type controllerType = Type.GetType("App1.UI.Web.Controllers." + controllerName + "Controller", true);
    object[] controllerAttributes = controllerType.GetCustomAttributes(true);

有没有更好的、不那么脆弱的方法来使用MVC管道实现同样的效果?我不想实例化控制器,我只想要它的属性。

在你做得太过分之前,请记住控制器不必以后缀“controller”结尾。MVC控制器的默认命名约定是在类中附加单词“Controller”。因此,默认设置为“HomeController”和“AboutController”。您可以轻松创建一个名为“MyHome”或“Dashboard”的类,并将其从Controller继承,它将是一个控制器,而无需“Controller”后缀

我在过去创建了路线约束。下面是我使用的一段代码:

 List<Type> _type = Assembly
                            .GetCallingAssembly()
                            .GetTypes()
                            .Where(type => type.IsSubclassOf(typeof(Controller)))
                            .ToList()

controllerName
变量来自哪里?属性提供了什么类型的信息?为什么您试图访问与正在执行的控制器不同的控制器?如果您在管道中,您应该能够使用ControllerDescriptor获取控制器名称的名称,然后使用反射来定位类型及其属性我们需要在另一个控制器上获取属性用于Html.ActionLink和Html.RouteLink的自定义安全感知替代方案的控制器。属性是AuthorizeAttribute的一个子类,它内置了额外的安全检查。使用新的ActionLink和RouteLink方法,我们可以根据用户是否有权访问链接引用的操作来生成锚定或跨度。我要补充的是,您可能希望使用类型为的静态IEnumerable(列表、数组等)并存储Assembly.GetCallingAssembly().GetTypes()然后在类型列表上应用where过滤器。这将提高速度,因为它将根据您需要调用列表的频率将列表保留在内存中。在我看来,它可能是静态的,因为类型列表在应用程序生命周期中不应更改,为了更改类型,您必须部署新代码,这将导致应用程序循环。非常优雅。谢谢Splash-x。
 .Where(type => type.IsSubclassOf(typeof(Controller)) && type.Name.ToLower() == "homecontroller")