我有以下功能
void Func<T>(IEnumerable<T> e)
{
// Need type of T here
Type t = e.CollectionElementsType() ???
}
现在让它变得更复杂,我有以下代码
void Func(IEnumerable<object> e)
{
// Need type of T here
Type t = e.CollectionElementsType() ???
}
现在说我对第二个实现有以下调用
Func(new List<int>().Cast<object>());
我希望Func检测int类型。 我怎么能做到这一点?
答案 0 :(得分:2)
在问题中:typeof(T)
将起作用。
通常可以在e
上使用反射来提取类型参数 - T
- IEnumerable<T>
来自Type.GetGenericArguments
。
答案 1 :(得分:1)
为什么不这样做? :
Type t = typeof(T);
详细了解typeof
编辑:
对于更复杂的情况,您可以拥有多种类型,因此您可以这样做:
IEnumerable<Type> GetTypes (IEnumerable<object> list)
{
foreach (object a in list)
{
yield return a.GetType();
}
}
如果它只是一种类型,你可以写Type t = GetTypes(yourEnumerable).FirstOrDefault()
。 GetType()
将获得真实类型的对象。
阅读GetType
答案 2 :(得分:1)
// returns an enumeration of T where o : IEnumerable<T>
public IEnumerable<Type> GetGenericIEnumerables(object o) {
return o.GetType()
.GetInterfaces()
.Where(t => t.IsGenericType == true
&& t.GetGenericTypeDefinition() == typeof(IEnumerable<>))
.Select(t => t.GetGenericArguments()[0]);
}
答案 3 :(得分:0)
要获得T的Type
,请使用此选项:
void Func(IEnumerable<T> e)
{
Type t = typeof(T);
}
要获取元素的Type
,另一种方法是获取第一个项目的类型(假设列表中的所有项目属于同一类型):
void Func(IEnumerable<T> e)
{
Type t;
if(e.Count() > 0){
t = e.ElementAt(0).GetType();
}
}