检查传递的对象是否为IEnumerable <t>或单个值 - 包括T是值类型

时间:2017-09-15 15:06:31

标签: c# generics ienumerable

在我的C#代码的一部分中,我使用以下代码来检查传入的对象是单个值还是实现IEnumerable<T>T是string,double,int等 - 从来不是一个复杂的对象或类):

Type type = paramValue.GetType();
if (type != typeof(string) && typeof(System.Collections.IEnumerable).IsAssignableFrom(type))
{
    var underlyingType = ((System.Collections.IEnumerable)paramValue).GetType().GetGenericArguments()[0];
}

直到今天,当我发现int[]因为我发现是一个问题here时,它在所有情况下都运行良好。

那么,获取同时考虑值类型的IEnumerable的基础类型的最佳方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:2)

您想了解类型,是否需要IEnumerable<T> string(!= T)?对于数组,您可以使用Type.GetElementType

public static Type GetUnderlyingType(object paramValue)
{
    Type type = paramValue.GetType();
    var stringType = typeof(string);
    if (type == stringType)
        return stringType;
    else if (type.IsArray)
        type = type.GetElementType();
    else if (typeof(System.Collections.IEnumerable).IsAssignableFrom(type))
    {
        var genericArguments = ((System.Collections.IEnumerable) paramValue).GetType().GetGenericArguments();
        if(genericArguments.Length > 0)
            type = genericArguments[0];
    }
    return type;
}

答案 1 :(得分:0)

正如@Servy所说,非通用IEnumerable序列可能包含几种不同类型的元素。

如果你只关心序列中的第一项并假设所有其他项都是同一类型,你可以尝试这样的事情:

int[] paramValue = new int[] { 1, 2, 3 };
Type type = paramValue.GetType();
Type underlyingType;
if (type != typeof(string))
{
    System.Collections.IEnumerable e = paramValue as System.Collections.IEnumerable;
    if(e != null)
    {
        Type eType = e.GetType();
        if(eType.IsGenericType)
        {
            underlyingType = eType.GetType().GetGenericArguments()[0];
        }
        else
        {
            foreach(var item in e)
            {
                underlyingType = item.GetType();
                break;
            }
        }
    }
}

请注意,作为示例,underlyingType对于以下int将为paramValue

object[] paramValue = new object[] { 1, "a", "c" };

答案 2 :(得分:-1)

IEnumerable 没有基础类型,至少不是object。您知道序列中的每个项目都是object,但您不知道更多。如果您想处理所有这些项目属于同一类型的项目序列(该类型不是object,那么您需要使用IEnumerable<T>,而不是IEnumerable

实际上,给你的任何给定的IEnumerable都可能有一个字符串,一个int和一个自定义对象,所有这些都在相同的序列中,所以 没有其他常见类型比object