我发现了许多类似的问题,但没有找到我想要的答案。我的部分问题是由于无法在属性中使用泛型。

我可能正在尝试使事情变得过于复杂,因此,如果您能想到一种更简单的方法,我将不知所措。

我的特定问题与ASP.NET MVC有关,在Action方法上使用属性(过滤器)。我正在尝试创建一个过滤器,以对传递给ViewData.Model的结果进行分页,如下所示:

[PagedList(PageSize = 2, ListType = typeof(Invoice))]
public ViewResult List()
{
    var invoices = invoicesRepository.Invoices; // Returns an IQueryable<Invoice>
    return View(Invoices);
}


我的过滤器的OnActionExecuted重写如下:

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
    ViewResult result = (ViewResult)filterContext.Result;
    var list = (IQueryable<?>)result.ViewData.Model; // Here I want to use the ListType in place of the ?

    // Perform pagination
    result.ViewData.Model = list.Skip((Page - 1) * PageSize).Take(PageSize.ToList();
}


我意识到我可以取代我的

var list = (IQueryable<?>)result.ViewData.Model;




var list = (IQueryable)result.ViewData.Model;
IQueryable<Object> oList = list.Cast<Object>();


但是我强烈认为我希望

IQueryable<Invoice>


不是

IQueryable<Object>

最佳答案

您是否可能在过滤器中创建需要执行的通用方法,然后在OnActionExecuted中使用反射使用ListType调用该通用方法?



编辑:例如,您将使用此签名创建一个新方法:

private void GenericOnActionExecuted<T>( ActionExecutedContext filterContext )


此方法将与您发布的代码相同。然后,您将像这样重写OnActionExecuted

public void OnActionExecuted( ActionExecutedContext filterContext )
{
    MethodInfo genericMethod =
        GetType().GetMethod( "GenericOnActionExecuted",
            BindingFlags.Instance | BindingFlags.NonPublic );

    MethodInfo constructedMethod = genericMethod.MakeGenericMethod( ListType );

    constructedMethod.Invoke( this, new object[] { filterContext } );
}

09-04 05:24