完璧なソリューションではありませんが、私はすべての組み合わせ(通常の回避策)のブルートフォースリストよりももっと良いものが一般的なインタフェースとジェネリック抽象クラスで達成することができることを見出しました。
このような、一般的なクラスを作成します。
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();
}
を、システムタイプがAOT記載されているジェネリッククラス用にコンパイルすることができますAOTConstructでは、インタフェースを実装するクラスの型として宣言されることにより、次のようになります。
public class SystemTypes : IGenericValue<float> // Implement IGenericValue for other Types.
{
GenericBase<float> IGenericValue<float>.ConstructGenericBase()
{
throw new NotImplementedException();
}
}
同じではシステムタイプと同じクラスで、または(私はわかりやすくするために好む)カスタムクラスの宣言の一部としてのいずれかで、任意のカスタムクラスのために行うことができます。
新しいシステムレベルのタイプをサポートするSystemTypesを更新し、サポートが必要な新しい汎用クラスのAOTConstructを更新しなければならないのは残念ですが、iOSへのコンパイルには適しています。リストされている。
こんにちはルネ、あなたの答えに感謝。これは私がやっていることですが、AOTプラットフォームではジェネリック型がプログラム内のどこにでも宣言されていないとExecutionEngineExceptionがスローされます。私はnownere MakeGenericTypeを使用してMyClassのを作成してあれば、たとえば、私は「MyClassのは」どこにでも私のコードでは、それは動作しません宣言しました。ダミーメソッドに「MyClass 」を追加すると、私の質問に投稿されました。 –
Rafael
ああ、それを知らなかった。ここAOTプラットフォームでの経験はありません。申し訳ありませんが、私はあなたを助けなかった。 –