Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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
Asp.net mvc 如何从ActionExecutingContext获取MethodInfo?_Asp.net Mvc - Fatal编程技术网

Asp.net mvc 如何从ActionExecutingContext获取MethodInfo?

Asp.net mvc 如何从ActionExecutingContext获取MethodInfo?,asp.net-mvc,Asp.net Mvc,如果我有ActionExecutingContext的实例,如何获取 有问题的操作?ActionExecutingContext有一个属性ActionDescriptor 如果返回类型实际上是一个ReflectedActionDescriptor,那么您应该能够将其转换为。一旦你有了一个ReflectedActionDescriptor 。。。您可以使用它的MethodInfo属性 您应该小心使用以操作名称命名的技术,并使用该名称获取MethodInfo。在许多情况下,操作的名称将与控制器上

如果我有ActionExecutingContext的实例,如何获取
有问题的操作?

ActionExecutingContext有一个属性ActionDescriptor

如果返回类型实际上是一个ReflectedActionDescriptor,那么您应该能够将其转换为。一旦你有了一个ReflectedActionDescriptor

。。。您可以使用它的MethodInfo属性


您应该小心使用以操作名称命名的技术,并使用该名称获取MethodInfo。在许多情况下,操作的名称将与控制器上的方法名称相同,但情况并非总是如此。如果在控制器的方法上使用ActionName属性,则可以显式设置操作的名称。此外,可能有两个具有不同签名的方法,它们都具有相同的操作名称。当您拥有相同操作的GET和POST版本时(例如,AccountController.cs中全新ASP.NET MVC项目中存在的注册和登录操作),这种情况很常见。

请尝试
Controller.GetType.GetMethod(actionExecutingContext.ActionName)


如果您的代码直接在操作中,您还可以调用
MethodBase.GetCurrentMethod()

我需要获取
MethodInfo
来获取自定义属性以用于某些日志记录目的

对于这个特定的用例,我注意到(至少在MVC5中)存在一个
ActionDescriptor.GetCustomAttributes
方法,并且它被每个
ActionDescriptor
子体正确地覆盖


类似地,还有其他相关方法,如
GetParameters
,等等。

MVC框架本身没有继承
ActionDescriptor
的其他类型。所以,您应该总是得到一个ReflectedActionDescriptor,我的方法会起作用。我使用“如果”一词作为MVC未来版本的保险,并建议在编写转换ActionDescriptor的代码时应考虑到这种可能性。我知道这非常古老,但如果您有一个Task/Async action方法,那么它就不是ReflectedActionDescription,而是TaskAsyncActionDescription。这可能会导致问题。@DanielLorenz TaskAsyncActionDescription的文档在哪里,我找不到。Nevermind在以下位置找到它:如果有多个同名方法,GetMethod解决方案如何工作?例如,登录或注册的两个重载(一个接受POST,另一个获取)。此外,还可以使用ActionName属性使操作名与方法名非常不同。您的答案要好得多。在许多情况下,我们只需要获取
MethodInfo
来获取自定义属性,因此使用此方法很酷,因为我们不需要获取
MethodInfo