检查对象是否为 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<>);