Приветствую вас знатоки. Подскажите кто знает. Как в unity передавать в метод массив любого типа?

К примеру есть простой код.. Какую сигнатуру метода надо прописать чтобы можно было передавать методу не только Image[],но и Text[], по отдельности.

Image[] imageBoxOpen = new Image[3];
Text[] textCollect = new Text[2];

 private void OnEnable()
    {
        Metod(imageBoxOpen,1);
    }

private void Metod(Image[] all ,int index)
    {
        foreach (var item in all)
        {
            item.gameObject.SetActive(false);
        }
    }


Нагуглил решение, но не понимаю его. Подскажите в чем туплю..


 public void Test()
    {
        Metod2(imageBoxOpen,2);
    }

 private void Metod2 <T>(T[] all, int index) // Методу все нравиться 
    {
        foreach (var item in all)
        {
            item.gameObject.SetActive(false);  // А тут доступа к gameobject нет ошибка. 
        }
    }

Ошибка CS1061 'T' does not contain a definition for 'gameObject' and no accessible extension method 'gameObject' accepting a first argument of type 'T' could be found (are you missing a using directive or an assembly reference?)


Ответы (2 шт):

Автор решения: Алексей Шиманский

Метод надо дополнить скорее всего так:

private void Metod2 <T>(T[] all, int index) where T : UnityEngine.UIElementsModuleLeave {


}

По поводу UnityEngine.UIElementsModuleLeave надо уточнить в документации, от кого конкретно унаследованы Image и Text и подставить самый верхний уровень наследования туда


А вызывать надо так:

Metod2<Text>(textCollect, 111);

или

Metod2<Image>(imageBoxOpen, 111);
→ Ссылка
Автор решения: Yaroslav

Ограничение универсального типа не позволяет использовать, как аргумент типы не наследуемые от указанного и соответственно происходит привидение T типа к указанному. gameObject это свойство Component.

private void SetActive<T>(IEnumerable<T> collection, bool active) where T : Component
{
    foreach (T e in collection)
        e.gameObject.SetActive(active);
}
SetActive(_images, false);

Подобно тому, как class, который ни от кого явно не наследуется, наследуется от object, без явного указателя where, T тоже имеет object тип, у которого естественно нет свойства gameObject.


Но Generic ТУТ ВООБЩЕ НЕ НУЖЕН! В where обычно указывается не типы классов, а new(), struct, INumber и т.д. в то время как у тебя Image и Text с общим предок, свойство которого и используется.

private void SetActive(IEnumerable<Component> components, bool active) 
{
    foreach (Component c in components)
        c.gameObject.SetActive(active);
}

В случаях, когда используется List<T>, то можно воспользоваться методом ForEach.

_images.ForEach(i => i.gameObject.SetActive(false));
→ Ссылка