c# - 检查泛型类型是否继承自泛型接口(interface)

标签 c# .net generics inheritance interface

我有一个基本接口(interface),IResponse...

public interface IResponse
{
    int CurrentPage { get; set; }
    int PageCount { get; set; }
}

...通用接口(interface) ICollectionResponse,它继承自基本接口(interface)...

public interface ICollectionResponse<T> : IResponse
{
    List<T> Collection { get; set; }
}

...和一个类,EmployeesResponse,它继承自通用接口(interface),随后是基接口(interface)...

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; }
}

我的问题就在这里。我有一个返回基本接口(interface) 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))

感谢任何反馈。

最佳答案

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

if (typeof(T).GetInterfaces().Any(
  i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(ICollectionResponse<>)))
{
  Console.WriteLine($"Do something for {param}");
}

IsGenericType用于查找任何通用接口(interface) - 在本例中它过滤掉 IReponse这也由 GetInterfaces() 返回.

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

正如评论中指出的那样,可以实现多个接口(interface),例如 ICollectionResponse<Employee>, ICollectionResponse<Person> .上面的代码将运行“Do Something”语句,并且不关心匹配项是一个还是多个。在不了解更多范围的情况下不能说这是否是一个问题。

关于c# - 检查泛型类型是否继承自泛型接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54469130/

相关文章:

c# - 以编程方式创建 SharePoint 列表

c# - Dictionary.ContainsKey() - 它是如何工作的?

generics - 如何在 VHDL 2008 中创建抽象数据类型的派生类型?

c# - 以编程方式打开/关闭操作中心

c# - File.Copy 方法使文件无法访问

.Net Framework 4.8 未显示在 Visual Studio Target Framework 下拉列表中

generics - haskell Data.HList 的简单使用示例

.net - 对两个或多个值排序常规列表

c# - Moq 断言一个抽象方法被调用

.net - .NET + SQL Server 的数据访问应用程序框架?