如何只获取 Enumerable 类型?

how to get only the type of Enumerable?

我想按类型分隔 IEnumerable 个变量。我的代码是这样的:

if (type is IEnumerable)
{
    var listGenericType = type.GetType().GetGenericTypeDefinition().Name;
    listGenericType = listGenericType.Substring(0, listGenericType.IndexOf('`'));
    if (listGenericType == "List") {
        //do something
    }

    else if (listGenericType == "HashSet") {
        //do something
    }
}

当我使用 type.GetType().GetGenericTypeDefinition().Name 时,listGenericType 就像 List`1HashSet`1,但我希望它像 ListHashSet。因此,我使用Substring来处理这个问题!

有没有不用 postProcessing string 类型来处理这个问题的方法?我的意思是像下面的代码:

if (type is IEnumerable)
{
    var listGenericType = type.GetType().GetGenericTypeDefinitionWithoutAnyNeedForPostProcessing();
    if (listGenericType == "List") {
        //do something
    }

    else if (listGenericType == "HashSet") {
        //do something
    }
}

您不必将它与字符串进行比较。由于 GetGenericTypeDefinition() returns 一个 type,您所要做的就是使用 typeof 运算符将其与类型进行比较,例如:

if (type is IEnumerable)
{
    var listGenericType = type.GetType().GetGenericTypeDefinition();

    if (listGenericType == typeof(List<>)) {
        //do something
    }
    else if (listGenericType == typeof(HashShet<>)) {
        //do something
    }
 } 

正如@nopeflow 在下面亲切指出的那样,如果您的类型不是泛型类型,那么 GetGenericTypeDefinition() 将抛出一个 InvalidOperationException。确保你考虑到这一点。

假设您只是在寻找通用类型,我相信这可能会对您有所帮助。

            List<int> someObject = new List<int>();
            Type currentType = someObject.GetType();

            if (currentType.IsGenericType)
            {
                if (currentType.GetGenericTypeDefinition() == typeof(List<>))
                {
                    // Do something
                }
                else if (currentType.GetGenericTypeDefinition() == typeof(HashSet<>))
                {
                    // Do something else
                }
            }