2016-12-02 59 views
0

嗨,我有以下的扩展方法未能转换为普通阵列

public static T[] GetComponentsOfType<T>(this GameObject source) where T : MonoBehaviour 
    { 
     Component[] matchingComponents = source.GetComponents<Component>().Where(comp => comp is T).ToArray(); 
     T[] castedComponents = new T[matchingComponents.Length]; 
     for (int i = 0; i < matchingComponents.Length; i++) 
     { 
      castedComponents[i] = (T) matchingComponents[i]; 
     } 
     return castedComponents; 
    } 

其中一期工程完全没问题,但是我试图通过只是一个单一的线缩短

return (T[]) source.GetComponents<Component>().OfType<T>().Cast<Component>().ToArray(); 

而且很显然,这条线失败将Component[]转换为T[],但是当我分别投射每个元素时,它会起作用(第一个示例)。这是为什么 ?

+1

好的 - 如果你已经创建了一个Component [],那*不是'FooComponent []'或者任何'T'。为什么不使用'OfType ().ToArray()'?你为什么打电话给'Cast ()'? –

+1

'Cast ()'没有意义。如果你想要'T',为什么要再次将它转换为'Component'? –

+0

Resharper让我这么做@JonSkeet :) – mashinkata

回答

2

你可以写:

source.GetComponents<Component>().OfType<T>().ToArray(); 

要做到这一点的一条线。

转换失败,因为您正在转换两种不匹配的类型,并且组件的数组与T的数组无效。

+1

你期望'Select'做什么? –

+0

@JonSkeet多谢,谢谢:) – Rafal

2

只能使用OfType<>。在你的解决方案中,你回到Component,这不能转换为T [],所以这个问题。

OfType<>已投下它。这就像一个替代Where(item => item is T).Cast<T>()

return source.GetComponents<Component>().OfType<T>().ToArray(); 
+2

没有必要在这一点演员阵容...... –

+0

确实'return source.GetComponents ().OfType ().ToArray();'完全够了,任务感谢你的快速反应! – mashinkata

+0

@JeroenvanLangen:但是你已经得到了实际的演员操作符'(T [])'。这是不必要的,因为'ToArray()'的返回类型已经是'T []'。 –