使用反射从MVC中的控制器获取结果/请求对象类型

本文关键字:结果 获取 请求 类型 对象 控制器 反射 MVC | 更新日期: 2023-09-27 18:01:12

我使用以下代码获得了所有通过反射从dll返回ActionResult的方法:

MyAssembly.GetTypes()
                .SelectMany(t => t.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public))
                .Where(d => d.ReturnType.Name == "ActionResult" && d.IsPublic);

现在,我想要每个控制器的请求对象和结果对象。

一般来说,在我的项目中,控制器的结构是这样的:

[ServiceControllerResult(typeof(MyControllerResult))]
public ActionResult MyController(MyControllerRequest request)
{
    var response = new ServiceResponse<MyControllerResult>();
    // do something
    return ServiceResult(response);
}

现在,我如何从dll(或存储我引用的ddl的目录(中获取MyControllerResult和MyControllerRequest对象?

感谢

使用反射从MVC中的控制器获取结果/请求对象类型

您可以检查方法参数以识别请求类型,并调查方法属性以获得结果类型。假设ServiceControllerResult属性具有Type属性:

foreach (var method in methods)
{
    var parameters = method.GetParameters();
    if (parameters.Length != 1)
    {
        //decide what to do here
        throw new Exception("More than one parameter found");
    }
    var requestType = parameters[0].ParameterType;
    var serviceControllerResultAttribute = method.GetCustomAttribute<ServiceControllerResultAttribute>();
    if (serviceControllerResultAttribute == null)
    {
        //decide what to do here
        throw new Exception("ServiceControllerResultAttribute was not found");
    }
    var resultType = serviceControllerResultAttribute.Type;
}