我知道奇怪的标题。
基本上,如果您有一个课程,例如:
public class SomeClass<T1, T2> : MonoBehaviour {}
是否有任何办法可以进行这样的操作,FindObjectsOfType<SomeClass<>>()
,并检索所有现有的SomeClass
,而与T1和T2无关?
答案 0 :(得分:1)
不,不是直接。
不过,您可以使用一些技巧:为其创建一个非通用基类
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?