在 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). 它给了我错误


'IQueryableExtensions.GetGridResult(IQueryable, 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; }

    }


动漫人物
浏览 211回答 3
3回答

ABOUTYOU

由于null没有类型,它无法确定类型TSearchFilter是什么。您可以通过指定类型来调用该方法,例如query.GetGridResult<string, object>(queryFilter),这样即使您可能不使用该对象null,它在您的上下文中仍然有效。老实说,我会保留 2 种单独的方法,并让一种方法调用另一种更详细的方法。

杨魅力

因为您正在尝试使用QueryFilter<TSearchFilter> queryFilter具有非泛型 class 值的泛型参数调用方法QueryFilter,这与泛型无关。编辑:如果您希望使用单一方法,则QueryFilter必须从QueryFilter<TSearchFilter>.

ibeautiful

我在@MariePichova's answer的帮助下找到了答案。我改变了我的 QueryFilter 类,如下所示。然后一切正常。public class QueryFilter<TSearchFilter> where TSearchFilter : class{&nbsp; &nbsp; public QueryFilter()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; SearchFilter = (TSearchFilter)Activator.CreateInstance(typeof(TSearchFilter));&nbsp; &nbsp; }&nbsp; &nbsp; public string SortBy { get; set; }&nbsp; &nbsp; public bool IsSortAscending { get; set; }&nbsp; &nbsp; public int PageFirstIndex { get; set; }&nbsp; &nbsp; public byte PageSize { get; set; }&nbsp; &nbsp; public TSearchFilter SearchFilter { get; set; }}public class QueryFilter : QueryFilter<EmptySearchFilter>{ }public class EmptySearchFilter{ }
打开App,查看更多内容
随时随地看视频慕课网APP