如何在未知泛型参数时用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
相关产品推荐
相关产品推荐

