我需要在 AOT 平台上运行时生成泛型类型。我知道一种“解决方法”,它提示编译器通过在代码中创建虚拟方法来生成特定的泛型类:
public void DoDummy(){
var a1 = new MyClass<MyType>();
}
不幸的是,这种特定的解决方法对我不起作用,因为我有超过几十万(毫不夸张)可以创建的类型的可能组合。
有什么办法可以实现我想要实现的目标吗?
虽然不是完美的解决方案,但我发现使用通用接口和通用抽象类可以实现比所有组合的强力列表(正常解决方法)更好的效果。
创建一个泛型类,如下所示:
public abstract class GenericBase<T>
{
public static bool AOTConstruct()
{
bool b = (new GV<T>() == null); // Where GV<T> is a Generic Class.
// Do similar for all Generic Classes that need to be AOT compiled.
return b;
}
}
然后创建一个通用接口,如下所示:
public interface IGenericValue<T>
{
GenericBase<T> ConstructGenericBase();
}
现在,可以通过将系统类型声明为实现接口的类的类型,为 AOTConstruct 中列出的通用类进行 AOT 编译,如下所示:
public class SystemTypes : IGenericValue<float> // Implement IGenericValue for other Types.
{
GenericBase<float> IGenericValue<float>.ConstructGenericBase()
{
throw new NotImplementedException();
}
}
对于任何自定义类都可以执行相同的操作,无论是在与系统类型相同的类中,还是作为自定义类声明的一部分(为了清楚起见,我更喜欢这样做)。
令人失望的是必须更新 SystemTypes 以支持新的系统级类型,并更新 AOTConstruct 以支持需要支持的新通用类,但它适用于编译到 iOS,并且不需要列出所有组合。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)