gpt4 book ai didi

c# - 如何在 AOT 平台上在运行时生成任何泛型类型?

转载 作者:行者123 更新时间:2023-11-29 12:00:29 27 4
gpt4 key购买 nike

我需要在 AOT 平台上运行时生成泛型类型。我知道一个“解决方法”,它提示编译器通过在代码中创建一个虚拟方法来生成一个特定的泛型类:

public void DoDummy(){
var a1 = new MyClass<MyType>();
}

不幸的是,这个特定的解决方法对我不起作用,因为我有超过几十万(毫不夸张)的可能类型组合可以创建。

有什么方法可以实现我想要实现的目标吗?

最佳答案

虽然这不是一个完美的解决方案,但我发现可以使用通用接口(interface)和通用抽象类来实现比所有组合的蛮力列表(正常解决方法)更好的方法。

创建一个泛型类,例如:

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;
}
}

然后创建一个通用接口(interface),例如:

public interface IGenericValue<T>
{
GenericBase<T> ConstructGenericBase();
}

现在,系统类型可以为 AOTConstruct 中列出的通用类进行 AOT 编译,方法是声明为实现接口(interface)的类的类型,如下所示:

public class SystemTypes : IGenericValue<float> // Implement IGenericValue for other Types.
{
GenericBase<float> IGenericValue<float>.ConstructGenericBase()
{
throw new NotImplementedException();
}
}

可以对任何自定义类执行相同的操作,无论是在与系统类型相同的类中,还是作为自定义类声明的一部分(为清楚起见,我更喜欢这样)。

令人失望的是必须更新 SystemTypes 以支持新的系统级类型,并更新 AOTConstruct 以支持需要支持的新通用类,但它适用于编译到 iOS 并且不需要列出所有组合.

关于c# - 如何在 AOT 平台上在运行时生成任何泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37238197/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com