在我的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
的基础类型的最佳方法是什么?
谢谢!
答案 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
。