【问题标题】:Can you find objects of a type which takes in 2 generic types, but regardless of those types?你能找到一种类型的对象,它接受 2 种泛型类型,但不管这些类型如何?
【发布时间】:2019-05-24 15:39:58
【问题描述】:

奇怪的标题,我知道。

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

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

有没有办法做这样的事情,FindObjectsOfType&lt;SomeClass&lt;&gt;&gt;(),并检索所有现有的SomeClass,而不考虑 T1 和 T2?

【问题讨论】:

    标签: c# unity3d generics


    【解决方案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?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      相关资源
      最近更新 更多