我发现了许多类似的问题,但没有找到我想要的答案。我的部分问题是由于无法在属性中使用泛型。
我可能正在尝试使事情变得过于复杂,因此,如果您能想到一种更简单的方法,我将不知所措。
我的特定问题与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 } );
}