1

バインドされた (UnityEngine.Component) リストをジェネリック (T) リストに変換する必要がありますが、これは可能ですか? どうやって?

私は Unity と C# を使用していますが、一般的にどのようにこれを行うのか知りたいです。

        List<Component> compList = new List<Component>();
        foreach(GameObject obj in objects)   // objects is List<GameObject>
        {
            var retrievedComp = obj.GetComponent(typeof(T));
            if(retrievedComp != null)
                compList.Add(retrievedComp);
        }

        List<T> newList = new List<T>(compList as IEnumerable<T>); // ERROR HERE

        foreach(T n in newList)
            Debug.Log(n);

ありがとう!

それが問題だと思います。このランタイムエラーが発生しています...

ArgumentNullException: Argument cannot be null.
Parameter name: collection
System.Collections.Generic.List`1[TestPopulateClass].CheckCollection (IEnumerable`1 collection)
System.Collections.Generic.List`1[TestPopulateClass]..ctor (IEnumerable`1 collection)
DoPopulate.AddObjectsToList[TestPopulate] (System.Reflection.FieldInfo target) (at Assets/Editor/ListPopulate/DoPopulate.cs:201)
System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture)
Rethrow as TargetInvocationException: Exception has been thrown by the target of an invocation.
System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture)
System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters)
DoPopulate.OnGUI () (at Assets/Editor/ListPopulate/DoPopulate.cs:150)
System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture)
4

2 に答える 2

1

やってみました

    List<T> newList = compList.OfType<T>().Select(x=>x).ToList()
于 2012-05-24T03:56:41.150 に答える
0

T と Component が異なる型であるという事実によって最も可能性が高いケース: List<Component> compListand compList as IEnumerable<T>(compList がIEnumerable<Component>notであるため、これは null になりますIEnumerable<T>)。

私はあなたが欲しいと思います:

    List<T> compList = new List<T>(); // +++ T instead of GameObject
    foreach(GameObject obj in objects)   // objects is List<GameObject> 
    { 
        // ++++ explict cast to T if GetComponent does not return T
        var retrievedComp = (T)obj.GetComponent(typeof(T)); 
        if(retrievedComp != null) 
            compList.Add(retrievedComp); 
    } 

    List<T> newList = new List<T>(compList as IEnumerable<T>); // ERROR HERE 

    foreach(T n in newList) 
        Debug.Log(n); 
于 2012-05-24T03:56:57.987 に答える