在C#

时间:2019-03-13 11:55:50

标签: c#

我有以下两种方法。我想将这两种方法合而为一。

当我喜欢下面两种方法完美工作时

public static async Task<GridResult<List<T>>> GetGridResult<T, TSearchFilter>(
    this IQueryable<T> query, 
    QueryFilter<TSearchFilter> queryFilter) where TSearchFilter : class
{
}

public static async Task<GridResult<List<T>>> GetGridResult<T>(
    this IQueryable<T> query, 
    QueryFilter queryFilter)
{
}

因此,我通过将null的默认QueryFilter<TSearchFilter> queryFilter值赋给public static async Task<GridResult<List<T>>> GetGridResult<T, TSearchFilter>( this IQueryable<T> query, QueryFilter<TSearchFilter> queryFilter = null) where TSearchFilter : class { } 来将自己的方法归为一种方法。

但是,当我执行一种方法时,却给了我错误

query.GetGridResult(queryFilter)

但是我不能通过public class QueryFilter<TSearchFilter> where TSearchFilter: class { public QueryFilter() { SearchFilter = (TSearchFilter)Activator.CreateInstance(typeof(TSearchFilter)); } public string SortBy { get; set; } public bool IsSortAscending { get; set; } public int PageFirstIndex { get; set; } public byte PageSize { get; set; } public TSearchFilter SearchFilter { get; set; } } public class QueryFilter { public string SortBy { get; set; } public bool IsSortAscending { get; set; } public int PageFirstIndex { get; set; } public byte PageSize { get; set; } } 这样的参数来调用我的方法。它给我错误

  

'IQueryableExtensions.GetGridResult(IQueryable,QueryFilter)'不能从用法中推断出来。尝试显式指定类型参数。

如何解决此错误?

?renderTable

3 个答案:

答案 0 :(得分:2)

由于null没有类型,因此无法确定TSearchFilter的类型。您可以通过指定类型来调用该方法,例如query.GetGridResult<string, object>(queryFilter),因此即使您可能不使用对象null,它在您的上下文中仍然有效。

老实说,我只能将其保留为2种单独的方法,而调用另一个则更为详细。

答案 1 :(得分:1)

因为您要尝试使用非通用类QueryFilter<TSearchFilter> queryFilter的值调用具有通用参数QueryFilter的方法,所以该方法与通用类无关。

编辑:如果您希望使用一种方法,那么QueryFilter必须从QueryFilter<TSearchFilter>派生。

答案 2 :(得分:1)

我是在@MariePichova的答案的帮助下找到答案的。我如下更改了QueryFilter类。然后一切正常。

public class QueryFilter<TSearchFilter> where TSearchFilter : class
{
    public QueryFilter()
    {
        SearchFilter = (TSearchFilter)Activator.CreateInstance(typeof(TSearchFilter));
    }
    public string SortBy { get; set; }
    public bool IsSortAscending { get; set; }
    public int PageFirstIndex { get; set; }
    public byte PageSize { get; set; }
    public TSearchFilter SearchFilter { get; set; }
}

public class QueryFilter : QueryFilter<EmptySearchFilter>
{ }

public class EmptySearchFilter
{ }