检查实例是否是给定类型的集合

时间:2017-10-02 17:33:10

标签: c# .net reflection

假设我有这个虚拟代码:

var object1 = new Test();

所以,如果我需要检查object1是否是Test类的实例,我可以这样做:

var type = typeof(Test);
Console.WriteLine(object1.GetType() == type); // will print true

但现在我有object2Test个对象列表):

var object2 = new List<Test>
{
    new Test(),
    new Test(),
    new Test()
};

我的问题是:如何检查object2是否为Test个实例列表?

3 个答案:

答案 0 :(得分:2)

您可以使用.GetType()将其与typeof(List<Test>) ..

进行比较
if (object2.GetType() == typeof(List<Test>))
{
    // do something
}

..或者您可以使用is表达式,如:

if (object2 is List<Test>)
{
    // do something
}
如果ifobject2List个对象,则

这些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);