检查对象是否为 System.Generic.List<T>,对于任何 T
Check if object is a System.Generic.List<T>, for any T
示例代码:
using System.Collections.Generic;
...
// could return anything.
private object GetObject(int code)
{
object obj = null;
if (code == 10)
{
var list1 = new List<Tuple<int, string>>();
list1.Add(new Tuple<int, string>(2, "blah"));
obj = list1;
}
else if (code == 20)
{
obj = "hello";
}
else if (code == 30)
{
var list2 = new List<string>();
list2.Add("o");
obj = list2;
}
// else etc, etc.
return obj;
}
private bool DoAction(int code)
{
object obj = GetObject(code);
bool isListT = ???
return isListT;
}
在上面的代码中,GetObject 可以return任何类型的对象。
在 DoAction 中,在调用 GetObject 之后,我希望能够判断 returned obj 是否是任何类型的 System.Collections.Generic.List<T>
。我不关心(也可能不知道)T 是什么。所以 DoAction(10) 和 DoAction(30) 应该 return 为真,而 DoAction(20) 应该 return 为假。
这应该有效
private static bool DoAction(int code)
{
object obj = GetObject(code);
return obj is IList;
}
然后:
var first = DoAction(10); //true
var second = DoAction(20); //false
var third = DoAction(30); //true
您可以使用Type.GetGenericTypeDefinition
object obj = GetObject(code);
Type type = obj?.GetType();
bool isList = type != null
&& type.IsGenericType
&& type.GetGenericTypeDefinition() == typeof(List<>);
示例代码:
using System.Collections.Generic;
...
// could return anything.
private object GetObject(int code)
{
object obj = null;
if (code == 10)
{
var list1 = new List<Tuple<int, string>>();
list1.Add(new Tuple<int, string>(2, "blah"));
obj = list1;
}
else if (code == 20)
{
obj = "hello";
}
else if (code == 30)
{
var list2 = new List<string>();
list2.Add("o");
obj = list2;
}
// else etc, etc.
return obj;
}
private bool DoAction(int code)
{
object obj = GetObject(code);
bool isListT = ???
return isListT;
}
在上面的代码中,GetObject 可以return任何类型的对象。
在 DoAction 中,在调用 GetObject 之后,我希望能够判断 returned obj 是否是任何类型的 System.Collections.Generic.List<T>
。我不关心(也可能不知道)T 是什么。所以 DoAction(10) 和 DoAction(30) 应该 return 为真,而 DoAction(20) 应该 return 为假。
这应该有效
private static bool DoAction(int code)
{
object obj = GetObject(code);
return obj is IList;
}
然后:
var first = DoAction(10); //true
var second = DoAction(20); //false
var third = DoAction(30); //true
您可以使用Type.GetGenericTypeDefinition
object obj = GetObject(code);
Type type = obj?.GetType();
bool isList = type != null
&& type.IsGenericType
&& type.GetGenericTypeDefinition() == typeof(List<>);