我有一个变量(我称之为prop),其类型是" object",我知道底层类型总是某种ICollection。我想迭代这个集合并对所有元素进行处理。
我的prop变量有一个方法GetType(),它返回类型。
foreach (var item in prop as ICollection<PCNWeb.Models.Port>)
{
//do more cool stuff here
}
问题在于我不知道ICollection在编译时的内部类型是什么(上面列为PCNWeb.Models.Port)。
调用prop.GetType().ToString()
(在这种情况下)会产生System.Collections.Generic.HashSet`1[PCNWeb.Models.Port]
我可以告诉我需要的信息,但不确定如何使其发挥作用。
我尝试了很多事情(尽管可能不正确):
尝试1:
Type t = prop.GetType();
foreach (var item in Convert.ChangeType(prop, t))
{
//do more cool stuff here
}
哪个收益率:
Compiler Error Message: CS1579: foreach statement cannot operate on variables of type 'object' because 'object' does not contain a public definition for 'GetEnumerator'
尝试2:
Type t = prop.GetType();
foreach (var item in prop as t)
{
//do more cool stuff here
}
哪个收益率:
Compiler Error Message: CS0246: The type or namespace name 't' could not be found (are you missing a using directive or an assembly reference?)
尝试3 :( Per @ DarkFalcon&#39; s建议)
Type t = prop.GetType();
foreach (var item in prop as ICollection)
{
//do more cool stuff here
}
哪个收益率:
Compiler Error Message: CS0305: Using the generic type 'System.Collections.Generic.ICollection<T>' requires 1 type arguments
答案 0 :(得分:2)
你必须这样做:
foreach (var item in prop as System.Collections.IEnumerable)
{
var t1 = item as Type1;
if(t1 != null)
{
//Do something
}
var t2 = item as DateTime?;
if(t2.HasValue)
{
//Do your stuff
}
}
答案 1 :(得分:1)
编译时间类型prop.GetType()
始终是一个对象..如果您确定所使用的类型,则可以使用dynamic
类型
dynamic proplist=prop;
foreach (dynamic item in proplist)
{
item.method1();
item.method2();
item.method3();
}
答案 2 :(得分:1)
foreach (var item in prop as System.Collections.IEnumerable)
{
}
应该有用。我认为您的代码文件中包含using System.Collections.Generic;
会让您感到懊恼(所以它认为您需要System.Collections.Generic.IEnumerable<T>
代替System.Collections.IEnumerable
)
如果你去查看the documentation for foreach
,你会在顶部看到这个:
foreach语句为数组中的每个元素或实现
的对象集合重复一组嵌入式语句System.Collections.IEnumerable
或System.Collections.Generic.IEnumerable<T>
所以基本上你只需要将prop
作为这两种类型中的一种引用。既然你不知道T,那么你应该使用非泛型的。