foreach in a list [C#]

时间:2013-03-15 11:22:20

标签: c# casting foreach polymorphism

MonoBehavior[] list; // This is from Unity3d but think of it as Object, 
                     // all classes inherit from it.

列表中包含很多东西,有些是Alpha,来自Alpha类,其他来自其他类。

foreach(Alpha a in list) // Alpha is a script. 
  a.doSomething();

我假设我的foreach会以这种方式工作:在列表中找到的Foreach Alpha脚本做了一些事情,忽略了所有其他组件。

我认为这是一个投射问题。请帮助我更好地理解cast / polymorphism。

我在执行期间遇到此错误: 无法从源类型转换为目标类型

7 个答案:

答案 0 :(得分:13)

您可以尝试以下内容:

foreach(Alpha a in list.Where(x => x is Alpha)) // Alpha is a script. 
  a.doSomething();

答案 1 :(得分:13)

你会以错误的方式处理多态:虽然Alpha是派生类型,但并不是MonoBehavior类型列表中的所有其他对象。因此有些人会失败foreach正在进行的隐式类型转换。 如果在您的环境中可用,可以使用“OfType()”扩展名:

foreach(Alpha a in list.OfType<Alpha>())

答案 2 :(得分:2)

使用OfType迭代指定类型的元素

答案 3 :(得分:2)

如果您希望循环仅对Alpha类型进行操作,则需要重写如下:

foreach (var item in list)
{
  if (item is Alpha)
  {
    ((Alpha) item).doSomething();
  }
}

编辑:Maarten的答案使用LINQ,它更简洁,所以我推荐一个。

答案 4 :(得分:2)

我就是这样做的,我确信它会在Unity3d中编译。虽然OfType不在Unity中,但TypeOf却是 taras.roshko 表示使用is更好。

MonoBehavior[] list;

foreach(MonoBehavior current in list) // Search the whole list for MonoBehaviors.
    if (current  is Alpha)            // Check if current is an Alpha type.
        current.doSomething();        // current is a valid Alpha type script.

foreach将尝试转换列表中的所有元素,因为Alpha是MonoBehavior但MonoBehavior不是Alpha,您无法正确运行它。因此,您检查当前是否为Alpha,然后检查它是否是您喜欢的。

答案 5 :(得分:0)

您的foreach语句会尝试将其中的每个对象转换为Alpha。如果他们有一个共同的超类,你可以使用它,否则使用Object类。

答案 6 :(得分:0)

如果您的列表包含基本类型列表,并且您只是考虑每个元素并尝试认为它是Alpha类型而非非法尝试使用以下

foreach(Unity3d a in list) // Alpha is a script. 
     a.doSomething();

假设在Unity3d中定义了doSomething()