相关疑难解决方法(0)

通过反射获取命名空间中的所有类型

如何通过C#中的反射获取命名空间中的所有类?

.net c# reflection namespaces

252
推荐指数
8
解决办法
15万
查看次数

如何在ActionExecutingContext中访问ActionDescriptor的MethodInfo.ReturnType?

我的应用程序上有一个ActionFilterAttribute,用于在检测到用户未经过身份验证时重定向用户.在过滤器中,我想检测一个动作的ReturnType何时是JsonResult.

作为一种解决方法,我最初创建了IsJsonResult的自定义属性,并使用该属性修饰了我的解决方案中的JsonResult方法.这有效,并在动作过滤器中实现如下:

public class CheckUser : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext actionExecutingContext)
    {
        base.OnActionExecuting(actionExecutingContext);
        object[] customAttributes = actionExecutingContext.ActionDescriptor.GetCustomAttributes(true);
        bool isJsonResult = customAttributes.FirstOrDefault(a => a.GetType() == typeof(IsJsonResult)) != null;

        if (isJsonResult)
        {
            return; // Don't perform any additional checks on JsonResult requests.
        }

        // Additional checking code omitted.
    }
}
Run Code Online (Sandbox Code Playgroud)

这有效,但我不喜欢在这个项目中装饰所有JsonResult动作的想法.如果将新的JsonResult添加到项目中,那很容易失败,我们忘记相应地装饰它.

此外,我可以看到名称为"JsonResult"的ReturnType位于上面显示的actionExecutingContext对象中的调试器中.以下是观察窗口中显示的路径:

actionExecutingContext > ActionDescriptor > [System.Web.Mvc.ReflectedActionDescriptor] > MethodInfo > ReturnType > FullName
Run Code Online (Sandbox Code Playgroud)

该FullName属性的值为"System.Web.Mvc.JsonResult".

所以我似乎可以直接从actionExecutingContext对象中提取该值,并创建一个支持方法来返回一个bool指标.为此,这里是我编写的代码.

    private bool isReturnTypeJson(ActionExecutingContext actionExecutingContext)
    {
        string actionName = actionExecutingContext.ActionDescriptor.ActionName;
        string controllerName = actionExecutingContext.ActionDescriptor.ControllerDescriptor.ControllerName;
        Type controllerType …
Run Code Online (Sandbox Code Playgroud)

.net c# asp.net asp.net-mvc

7
推荐指数
1
解决办法
1970
查看次数

标签 统计

.net ×2

c# ×2

asp.net ×1

asp.net-mvc ×1

namespaces ×1

reflection ×1