- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的应用程序上有一个 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.
}
}
这行得通,但我不喜欢装饰该项目中所有 JsonResult 操作的想法。如果一个新的 JsonResult 被添加到项目中,这很容易失败,而我们忘记相应地装饰它。
此外,我可以看到名称为“JsonResult”的 ReturnType 位于上面所示的 actionExecutingContext 对象内的调试器中。这是监 window 口中显示的路径:
actionExecutingContext > ActionDescriptor > [System.Web.Mvc.ReflectedActionDescriptor] > MethodInfo > ReturnType > FullName
该 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 = actionExecutingContext.Controller.GetType();
try
{
// Only effective when the actionName is not duplicated in the controller.
Type returnType = controllerType.GetMethod(actionName).ReturnType;
return (returnType.Name == "JsonResult");
}
catch (AmbiguousMatchException)
{
// Using LINQ, can I filter this collection to isolate just the methods
// that have the same name as the "actionName" variable above?
MethodInfo[] methodsInfoCollection = controllerType.GetMethods(BindingFlags.Public | BindingFlags.Instance);
// Attempted code from https://stackoverflow.com/questions/15283158/net-mvc-counting-action-methods-in-web-application
//var info = typeof(controllerType)
// .Assembly.GetTypes()
// .Where(t => typeof(Controller).IsAssignableFrom(t))
// .Where(t => t.Namespace.StartsWith("AwesomeProduct.Web"))
// .SelectMany(t => t.GetMethods(BindingFlags.Public | BindingFlags.Instance))
// .Where(m => typeof(ActionResult).IsAssignableFrom(m.ReturnType))
// .Where(m => !m.IsAbstract)
// .Where(m => m.GetCustomAttribute<NonActionAttribute>() == null);
}
return false;
}
只要 Action 名称在 Controller 中是唯一的,就可以在 try block 中分配 returnType。但是如果 Controller 中有多个相同 Action 名称的实例,则会发生 AmbiguousMatchException。因此,在 catch block 中,我已将方法分配给一个集合。 使用 LINQ,我如何过滤来自 methodsInfoCollection 变量的值到通过 ActionExecutingContext 到达的操作?
下面是我研究过的一些文章,并使用了其中的一些想法。但我还没有弄清楚。
感谢您的帮助。
==============
更新到原始代码。这可行,但循环并不理想。
private bool isReturnTypeJson(ActionExecutingContext actionExecutingContext)
{
string actionName = actionExecutingContext.ActionDescriptor.ActionName;
string controllerName = actionExecutingContext.ActionDescriptor.ControllerDescriptor.ControllerName;
Type controllerType = actionExecutingContext.Controller.GetType();
try
{
// Only effective when the actionName is not duplicated in the controller.
Type returnType = controllerType.GetMethod(actionName).ReturnType;
return (returnType.Name == "JsonResult");
}
catch (AmbiguousMatchException)
{
// Using LINQ, can I filter this collection to isolate just the methods with a name of actionName.
MethodInfo[] methodInfoCollection = controllerType.GetMethods(BindingFlags.Public | BindingFlags.Instance);
foreach (MethodInfo methodInfo in methodInfoCollection)
{
if (methodInfo.ReturnType != null) {
if (methodInfo.ReturnType == typeof(ActionResult))
{
return false;
}
if (methodInfo.ReturnType == typeof(JsonResult))
{
return true;
}
}
}
}
return false;
}
请参阅下面 Reza Aghaei 的解决方案。他的解决方案完全消除了对单独方法的需求。
最佳答案
你可以使用
((ReflectedActionDescriptor)filterContext.ActionDescriptor).MethodInfo.ReturnType
这是我试图检查返回类型是否为 JsonResult
的内容:
((ReflectedActionDescriptor)filterContext.ActionDescriptor).MethodInfo.ReturnType == typeof(JsonResult)
它为我的操作返回 true:
public JsonResult Index()
{
return Json(new { });
}
关于c# - 如何访问 ActionExecutingContext 中 ActionDescriptor 的 MethodInfo.ReturnType?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33089280/
假设我有这样一个类: public class MyClass { public void Foo(T t) { } } 现在,假设我有一个 MyClass 的实例和一个 Me
我有一个类类型的方法的MethodInfo,它是该类实现的接口(interface)定义的一部分。 如何检索类实现的接口(interface)类型上方法的匹配 MethodInfo 对象? 最佳答案
我的问题是:如果我有一个方法的 MethodInfo 对象,它是从一个接口(interface)类型获得的,我还有一个实现这个接口(interface)的类的 Type 对象,但是它用一个显式实现,如
获取 MethodInfo 对于 Enumerable.OfType() 我们可以使用: typeof(System.Linq.Enumerable).GetMethod("OfType", new
我正在开发一个程序,该程序根据一组输入在运行时计算表达式,然后远程执行这些表达式。这需要动态创建调用不同辅助函数的表达式。 对于静态辅助函数,可以通过使用以下方式获取 MethodInfo 实例来保证
我正在开发一个程序,该程序根据一组输入在运行时计算表达式,然后远程执行这些表达式。这需要动态创建调用不同辅助函数的表达式。 对于静态辅助函数,可以通过使用以下方式获取 MethodInfo 实例来保证
我已经为日志库创建了包装器,我想在其中记录抛出异常的外部方法的参数: public void MethodA(string param1, int param2) { try { th
有没有一种方法可以调用方法并且返回类型是强类型的? 有代码示例 public static IQueryable FilterVersion(this Table t, IVersionIndexF
我想知道 MethodInfo 是否适合用作字典键。从我非常有限的测试来看,一切似乎都很好,但是这里有什么问题吗? 有人做过吗? 最佳答案 MethodInfo 是一个抽象类,因此您的问题不能直接回答
我正在尝试使用反射调用方法。 像这样: method.Invoke(instance, propValues.ToArray()) 问题是没有办法确保参数数组的顺序正确。有没有办法通过名称指定哪些值适
类似于我之前的一个问题,当我询问获取字段的 FieldInfo 时,How to get the FieldInfo of a field from the value ,根据那里的答案,我编译了这个
我有以下方法: public TResult Call(Expression> code) { var returnValue = default(TResult); // code
我正在尝试获取 MethodInfo方法的对象: Any(IEnumerable, Func) 我遇到的问题是如何为 Func 指定类型参数有点…… MethodInfo method = typeo
我有一个定义如下的类 interface ITest { List Find(int i); } class Test: ITest { public T List Fin
我想从具有仅在运行时已知的类型参数的泛型类中获取方法的 MethodInfo。 下面是我如何从非泛型类中获取泛型方法的 MethodInfo: class MyClass { public v
我有一个 IEnumerable , 我想调用 Enumerable.Contains 反射法。我只是在努力使语法正确。这是我目前拥有的: var containsMethod = typeof(En
构造函数如下所示: public NameAndValue(string name, string value) 我需要使用反射将其作为 MethodInfo 获取。它尝试了以下操作,但没有找到构造函
我无法像我怀疑的那样获取扩展方法的方法信息。怎么了? _toStringMethod = typeof(ObjectExtensions).GetMethod("TryToString", B
这个问题在这里已经有了答案: get methodinfo from a method reference C# (7 个答案) 关闭 9 年前。 是否可以从方法符号中获取 MethodInfo 对
我的这个类型包含一个泛型方法的两个重载。我喜欢使用反射检索其中一个重载(使用 Func 参数)。然而问题是我找不到正确的参数类型来提供 Type.GetMethod(string, Type[])方法
我是一名优秀的程序员,十分优秀!