列表中的foreach[C#]
这个列表充满了很多东西,一些是Alpha,来自Alpha类,还有一些来自其他类列表中的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脚本做点什么,忽略其他所有组件 我认为这是一个铸造问题。请帮助我更好地理解铸造/多态性 我
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.