C#对象运行时类型转换

时间:2013-07-18 14:18:01

标签: c# casting

我有一个变量(我称之为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

3 个答案:

答案 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.IEnumerableSystem.Collections.Generic.IEnumerable<T>

的对象集合重复一组嵌入式语句

所以基本上你只需要将prop作为这两种类型中的一种引用。既然你不知道T,那么你应该使用非泛型的。