You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在未知泛型参数时用is检查变量是否为特定泛型类型?

如何在未知泛型参数的情况下检查变量是否为特定泛型类型?

比如这段C#代码:

using System;
using System.Collections.Generic;

public static class Program {
    public static void Main(string[] args) {
        List<string> list = new List<string>();

        if (list is List<object>)
            Console.WriteLine("Success");
        else
            Console.WriteLine("Failure");
    }
}

虽然string继承自object,但这段代码输出的是Failure。怎么让程序识别出list是List<T>类型,而不需要知道T的具体值?

解决方案

方法1:通过泛型定义判断

可以获取变量的类型后,对比其泛型定义与List<>的泛型定义:

using System;
using System.Collections.Generic;

public static class Program {
    public static void Main(string[] args) {
        List<string> list = new List<string>();
        Type listType = list.GetType();
        
        if (listType.IsGenericType && listType.GetGenericTypeDefinition() == typeof(List<>))
            Console.WriteLine("Success");
        else
            Console.WriteLine("Failure");
    }
}

这段代码会输出Success,逻辑是:

  • 先判断当前类型是否为泛型类型
  • 再获取它的泛型定义(剥离具体参数的模板),和typeof(List<>)做对比,即可匹配任意List<T>实例。

方法2:使用模式匹配(C# 7.0+)

C# 7及以上版本支持更简洁的模式匹配语法:

using System;
using System.Collections.Generic;

public static class Program {
    public static void Main(string[] args) {
        List<string> list = new List<string>();
        
        if (list is List<>)
            Console.WriteLine("Success");
        else
            Console.WriteLine("Failure");
    }
}

直接用List<>作为匹配模式,就能识别任意泛型参数的List实例,代码更简洁直观。

原代码失败的原因

C#中List<T>是不变泛型类型,也就是说List<string>不能被视为List<object>——哪怕string是object的子类。只有当泛型类型被声明为协变(比如IEnumerable<out T>)时,IEnumerable<string>才能隐式转换为IEnumerable<object>。

内容的提问来源于stack exchange,提问作者HarrisonO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:05:03