我想检查泛型变量是否属于某种类型但不想检查通用部分。
假设我有List<int>
的变量和List<double>
的另一个变量。我只想检查它是否为List<>
if(variable is List) {}
而不是
if (variable is List<int> || variable is List<double>) {}
这可能吗?
由于
答案 0 :(得分:9)
variable.GetType().IsGenericType &&
variable.GetType().GetGenericTypeDefinition() == typeof(List<>)
当然,这只适用于变量属于List<T>
类型且不是派生类的情况。如果要检查它是List<T>
还是从它继承,您应该遍历继承层次结构并检查每个基类的上述语句:
static bool IsList(object obj)
{
Type t = obj.GetType();
do {
if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<>))
return true;
t = t.BaseType;
} while (t != null);
return false;
}
答案 1 :(得分:6)
您可以通过反射测试完全类型:
object list = new List<int>();
Type type = list.GetType();
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
{
Console.WriteLine("is a List-of-" + type.GetGenericArguments()[0].Name);
}
就个人而言,我会寻找IList<T>
- 比具体的List<T>
更通用:
foreach (Type interfaceType in type.GetInterfaces())
{
if (interfaceType.IsGenericType
&& interfaceType.GetGenericTypeDefinition()
== typeof(IList<>))
{
Console.WriteLine("Is an IList-of-" +
interfaceType.GetGenericArguments()[0].Name);
}
}
答案 2 :(得分:5)
Type t = variable.GetType();
if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<>))
{
// do something
}