是否可以找到带有2个泛型类型的对象,而无论这些类型是什么?

时间:2019-05-24 06:33:16

标签: c# unity3d generics

我知道奇怪的标题。

基本上,如果您有一个课程,例如:

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

是否有任何办法可以进行这样的操作,FindObjectsOfType<SomeClass<>>(),并检索所有现有的SomeClass,而与T1和T2无关?

1 个答案:

答案 0 :(得分:1)

不,不是直接。

不过,您可以使用一些技巧:为其创建一个非通用基类

public abstract class SomeBase : MonoBehaviour { }

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

现在您可以简单地使用

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

但是,这仅返回SomeBase类型,您将无法访问SomeClass的内部内容。足以访问例如transformgameObject

您可以添加一些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,我认为您需要使用反射。有一些例子例如How to cast a generic type at runtime in c#Cast generic type without knowing T?