0

我有一个变量(我称之为 prop),它的类型是“对象”,我知道底层类型总是某种 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:(根据@DarkFalcon 的建议)

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
4

3 回答 3

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
    }
}
于 2013-07-18T14:24:42.723 回答
1

编译时类型prop.GetType()永远是一个对象。如果你确定你正在使用的类型,你可以使用dynamictype 代替

dynamic proplist=prop;
foreach (dynamic item in proplist)
{
    item.method1();
    item.method2();
    item.method3();
}
于 2013-07-18T14:23:17.420 回答
1
foreach (var item in prop as System.Collections.IEnumerable)
{

}

那应该工作。我认为您的代码文件中有 a 会绊倒using System.Collections.Generic;您(因此它认为您想要System.Collections.Generic.IEnumerable<T>而不是System.Collections.IEnumerable

如果您查看文档,foreach您会在顶部看到:

foreach 语句为数组或对象集合中的每个元素重复一组嵌入语句,该对象集合实现了System.Collections.IEnumerableorSystem.Collections.Generic.IEnumerable<T>

所以基本上你只需要让你prop被引用为这两种类型之一。既然你不知道 T,那么你应该选择非通用的。

于 2013-07-18T14:31:39.627 回答