如何只获得Enumerable的类型?

时间:2015-10-28 07:29:05

标签: c# ienumerable

我想按类型分隔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
    }
}

2 个答案:

答案 0 :(得分:5)

您不必将其与字符串进行比较。由于GetGenericTypeDefinition()会返回类型,您只需将其与使用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。请务必考虑到这一点。

答案 1 :(得分:0)

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

            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
                }
            }