当我所知道的是"HelloWorld"
课时,是否有一种有效的方法来获取控件名HelloWorldController
?
可能是这样的:
var str = HelloWorldController.NetExtensionMethodWhichRetursActionName(); // str =“HelloWorld”
编辑:不能存在,因为(当前)扩展方法仅存在于实例
或
var str = NetUtilClass.MethodWhichRetursActionNameFromControllerclass(typeof(HelloWorldController)); // str = "HelloWorld"
或其他......
我知道我可以这样写:
string GetName<T>() where T : Controller { var s = typeof(T).Name; return s.Delete(s.Length - "Controller".Length; }
但我想这个功能已在框架中提供。
答案 0 :(得分:2)
在构造函数中(在C#中),您可以获取类名:
this.GetType().Name
在操作中,您可以从RouteData获取C#中的控制器名称:
RouteData.Values["controller"]
答案 1 :(得分:2)
DefaultHttpControllerSelector
有一个受保护的方法,可以根据默认的<controller name>Controller
类命名约定来获取控制器的名称。
继续在实用程序类中继承DefaultHttpControllerSelector
可以做到这一点。我不再需要这个了,所以我将实现留给你的想象力。
答案 2 :(得分:1)
答案 3 :(得分:1)
没有内置函数会自动为您执行此操作,因为将“Controller”放在名称的末尾只是一种常见做法。不能保证控制器实际上会以这种方式命名,因此检查类型是否为Controller并不足以确保该功能能够满足您的需求。出于这个原因,我会认为你的设计决定走这条路。如果有人决定在某个时候重命名你的控制器怎么办?如果控制器名称基于更改,但控制器名称不是什么呢?
如果你决定走这条路,你必须自己编写这个功能。把它放在一般的实用类中似乎是最好的选择。另一种可能的方法是创建一个扩展Controller并实现此功能的类,然后让控制器直接扩展它而不是Controller。
答案 4 :(得分:0)
为什么不直接使用:
string controllerName = nameof(HomeController).Replace("Controller", "");
//controllerName = "Home"
更新
对于那些痴迷于性能的人来说,以下代码的性能提高了大约 3 倍:
string controllerName = nameof(HomeController);
controllerName = controllerName.Remove(controllerName.Length - 10);//10 is length of "Controller"