为了账号安全,请及时绑定邮箱和手机立即绑定

在 C# 中为泛型参数赋予默认值

在 C# 中为泛型参数赋予默认值

C#
动漫人物 2022-10-23 15:53:42
我有两种方法,如下所示。我想在一种方法中收集这两种方法。当我确实喜欢以下两种方法时,效果很好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; }    }
查看完整描述

3 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

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

老实说,我会保留 2 种单独的方法,并让一种方法调用另一种更详细的方法。


查看完整回答
反对 回复 2022-10-23
?
杨魅力

TA贡献1811条经验 获得超6个赞

因为您正在尝试使用QueryFilter<TSearchFilter> queryFilter具有非泛型 class 值的泛型参数调用方法QueryFilter,这与泛型无关。

编辑:如果您希望使用单一方法,则QueryFilter必须从QueryFilter<TSearchFilter>.


查看完整回答
反对 回复 2022-10-23
?
ibeautiful

TA贡献1993条经验 获得超5个赞

我在@MariePichova's answer的帮助下找到了答案。我改变了我的 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

{ }


查看完整回答
反对 回复 2022-10-23
  • 3 回答
  • 0 关注
  • 210 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信