【发布时间】:2019-05-24 15:39:58
【问题描述】:
奇怪的标题,我知道。
基本上,如果您有课程,例如:
public class SomeClass<T1, T2> : MonoBehaviour {}
有没有办法做这样的事情,FindObjectsOfType<SomeClass<>>(),并检索所有现有的SomeClass,而不考虑 T1 和 T2?
【问题讨论】:
奇怪的标题,我知道。
基本上,如果您有课程,例如:
public class SomeClass<T1, T2> : MonoBehaviour {}
有没有办法做这样的事情,FindObjectsOfType<SomeClass<>>(),并检索所有现有的SomeClass,而不考虑 T1 和 T2?
【问题讨论】:
不,不直接。
不过你可以使用一个小技巧:为它创建一个非泛型基类
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,我认为您需要使用反射。有一些例子,例如How to cast a generic type at runtime in c# 或Cast generic type without knowing T?
【讨论】: