假设我有这个虚拟代码:
var object1 = new Test();
所以,如果我需要检查object1
是否是Test
类的实例,我可以这样做:
var type = typeof(Test);
Console.WriteLine(object1.GetType() == type); // will print true
但现在我有object2
(Test
个对象列表):
var object2 = new List<Test>
{
new Test(),
new Test(),
new Test()
};
我的问题是:如何检查object2
是否为Test
个实例列表?
答案 0 :(得分:2)
您可以使用.GetType()
将其与typeof(List<Test>)
..
if (object2.GetType() == typeof(List<Test>))
{
// do something
}
..或者您可以使用is
表达式,如:
if (object2 is List<Test>)
{
// do something
}
如果if
是object2
个List
个对象,则这些Test
- 语句将成立。
注意强>
两者都适合您想要做的事情,但.GetType()
,typeof(..)
和is
之间也存在一些差异。这些解释如下:Type Checking: typeof, GetType, or is?
答案 1 :(得分:1)
怎么样?
Type myListElementType = object2.GetType().GetGenericArguments().Single();
if (myListElementType == typeof(Test))
答案 2 :(得分:0)
通过反映在底层IList
上实现的接口,有一种更通用的方法来查找绑定到列表的类型。这是我用于查找绑定类型的扩展方法:
/// <summary>
/// Gets the underlying type bound to an IList. For example, if the list
/// is List{string}, the result will be typeof(string).
/// </summary>
public static Type GetBoundType( this IList list )
{
Type type = list.GetType();
Type boundType = type.GetInterfaces()
.Where( x => x.IsGenericType )
.Where( x => x.GetGenericTypeDefinition() == typeof(IList<>) )
.Select( x => x.GetGenericArguments().First() )
.FirstOrDefault();
return boundType;
}
在O.P.的案例中:
bool isBound = object2.GetBoundType() == typeof(Test);