Можете ли вы найти объекты типа, который принимает 2 общих типа, но независимо от этих типов? - PullRequest
3 голосов
/ 24 мая 2019

Нечетное название, я знаю.

В основном, если у вас есть класс, например ::1003*

public class SomeClass<T1, T2> : MonoBehaviour {}

есть ли способ сделать что-то подобное, FindObjectsOfType<SomeClass<>>(), и получить все существующие SomeClass независимо от T1 и T2?

1 Ответ

1 голос
/ 24 мая 2019

Нет, не напрямую.

Однако вы можете использовать небольшую хитрость: создайте для него неуниверсальный базовый класс

public abstract class SomeBase : MonoBehaviour { }

public class SomeClass<T1, T2> : SomeBase { }

Теперь вы можете просто использовать

SomeBase[] instances = FindObjectsOfType<SomeBase>();

Однако это возвращает только тип SomeBase, и вы не получите доступ к внутреннему содержимому SomeClass.Достаточно для доступа, например, transform или gameObject.

Вы можете добавить некоторые свойства abstract, чтобы позже можно было преобразовать их в правильный тип:

public abstract class SomeBase : MonoBehaviour
{
    public abstract Type GetT1 { get; }
    public abstract Type GetT2 { get; }
}

public class SomeClass<T1, T2> : SomeBase
{
    public override Type GetT1
    {
        get { return typeof(T1); }
    }

    public override Type GetT2
    {
        get { return typeof(T2); }
    }
}

Теперь вы можете просто сделать, например,

var test = FindObjectsOfType<SomeBase>();
foreach (var someClass in test)
{
    Debug.LogFormat("Instance found on {0}: T1={1}, T2={2}", someClass.name, someClass.GetT1.Name, someClass.GetT2.Name);
}

Для дальнейшей настройки типов предметов к цели SomeClass Я думаю, вам нужно будет использовать отражение.Есть несколько примеров, например, Как привести универсальный тип во время выполнения в c # или также Привести универсальный тип, не зная T?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...