列表中的foreach[C#]

列表中的foreach[C#],c#,casting,foreach,polymorphism,C#,Casting,Foreach,Polymorphism,这个列表充满了很多东西,一些是Alpha,来自Alpha类,还有一些来自其他类 MonoBehavior[] list; // This is from Unity3d but think of it as Object, // all classes inherit from it. 我假设我的foreach会这样工作:在列表中找到的foreach Alpha脚本做点什么,忽略其他所有组件 我认为这是一个铸造问题。请帮助我更好地理解铸造/多态性 我

这个列表充满了很多东西,一些是Alpha,来自Alpha类,还有一些来自其他类

MonoBehavior[] list; // This is from Unity3d but think of it as Object, 
                     // all classes inherit from it.
我假设我的foreach会这样工作:在列表中找到的foreach Alpha脚本做点什么,忽略其他所有组件

我认为这是一个铸造问题。请帮助我更好地理解铸造/多态性

我在执行过程中遇到此错误:
无法从源类型强制转换为目标类型

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

仅用于迭代指定类型的元素您可以尝试以下操作:

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

如果希望循环仅在
Alpha
类型上运行,则需要按照以下方式重写:

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

编辑:Maarten的答案使用LINQ,这更简洁,因此我建议使用LINQ。

您在多态性方面走错了方向:虽然Alpha是派生类型,但类型MonoBehavior列表中并非所有其他对象都是。因此,有些会使foreach正在执行的隐式类型转换失败。 如果“OfType()”扩展在您的环境中可用,则可以使用该扩展:

foreach (var item in list)
{
  if (item is Alpha)
  {
    ((Alpha) item).doSomething();
  }
}
foreach(类型()列表中的Alpha a)

如果您的列表包含基本类型的列表,而您只是获取每个元素,并尝试将其视为Alpha类型,而不是非法的,请尝试使用下面的方法

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

假设doSomething()是在Unity3d中定义的,我会这样做,我确信它会在Unity3d中编译。顺便说一句,OfType不是统一的,TypeOf是统一的,但正如塔拉斯·罗斯科所说,使用
is
更好

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

foreach
将尝试转换列表中的所有元素,由于Alpha是单行为,但单行为不是Alpha,因此无法正确运行它。因此,您可以检查current是否为Alpha,然后根据您的喜好使用它。

更好的决定是使用'as'运算符,即使用
is
关键字实际上与
相同,如果A.GetType==TypeOf(Alpha)
?'is'在A为null时不会失败(它将被计算为false),对null调用“GetType”将导致NullReferenceException,因此“is”方法更好。但更好的是使用“as”运算符。下一步是使用“OfType”LINQ方法)
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.