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

检查泛型类型是否继承自泛型接口

检查泛型类型是否继承自泛型接口

C#
宝慕林4294392 2022-08-20 15:08:36
我有一个基本接口,IResponse...public interface IResponse{    int CurrentPage { get; set; }    int PageCount { get; set; }}...一个通用接口,ICollectionResponse,它继承自基本接口...public interface ICollectionResponse<T> : IResponse{    List<T> Collection { get; set; }}...和一个类,EmployeesResponse,它继承自通用接口,随后继承自基本接口...public class EmployeesResponse : ICollectionResponse<Employee>{    public int CurrentPage { get; set; }    public int PageCount { get; set; }    public List<Employee> Collection { get; set; }}public class Employee{    public string FirstName { get; set; }    public string LastName { get; set; }}我的问题就在这里。我有一个通用任务方法,它返回基本接口的实例 IResponse。在此方法中,我需要确定 T 是否从 ICollectionResponse 实现。public class Api{    public async Task<IResponse> GetAsync<T>(string param)    {        // **If T implements ICollectionResponse<>, do something**        return default(IResponse);    }}我已经尝试了所有版本的 IsAssignableFrom() 方法,但没有成功,包括:typeof(ICollectionResponse<>).IsAssignableFrom(typeof(T))我感谢任何反馈。
查看完整描述

2 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

由于您没有任何必须使用的反射实例。T


if (typeof(T).GetInterfaces().Any(

  i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(ICollectionResponse<>)))

{

  Console.WriteLine($"Do something for {param}");

}

IsGenericType用于查找任何通用接口 - 在此示例中,它过滤掉了也由 返回的接口。IReponseGetInterfaces()


然后从哪个是我们要检查的类型移动到哪个类型。因为我们不知道是什么。GetGenericTypeDefinitionICollectionResponse<Employee>ICollectionResponse<>Employee


正如注释中指出的那样,可以实现多个接口,例如 .上面的代码将运行“做某事”语句,并且不关心是否有一个匹配项或多个匹配项。在不知道更多范围的情况下,不能说这是否是一个问题。ICollectionResponse<Employee>, ICollectionResponse<Person>


查看完整回答
反对 回复 2022-08-20
?
桃花长相依

TA贡献1860条经验 获得超8个赞

这对你有用吗?


List<bool> list = new List<bool>();


foreach (var i in list.GetType().GetInterfaces())

{

  if (i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IList<>))

  { }

}


查看完整回答
反对 回复 2022-08-20
  • 2 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号