2016-05-15 8 views
1

実行時にAOTプラットフォーム上で汎用タイプを生成する必要があります。私は、コード内でダミーメソッドを作成することにより、特定の一般的なクラスを生成するようにコンパイラーにヒント「回避策」を知っている:私は、数百の上に持っているようAOTプラットフォームで実行時に汎用タイプを生成するにはどうすればよいですか?

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

残念ながら、この具体的な回避策は私のために動作しません。何千もの(誇張しない)可能な種類の組み合わせを作り出すことができる。

私が達成しようとしているものを達成する方法はありますか?

答えて

0

私は私はあなたが何をしたいのか理解していることを100%わからないんだけど、多分これは、次のことに役立ちます。

private static object Create(Type genericType, params Type[] genericArguments) 
{ 
    Type genericClass = genericType.MakeGenericType(genericArguments); 
    return Activator.CreateInstance(genericClass); 
} 

この方法は、あなたが作成したいgenericTypeのためのすべての必要なジェネリック型引数を作成し、パラメータのないコンストラクタを使用して結果の型のインスタンスを作成します。あなたは

public class MyClass<T> 
{ 
} 

ようなクラスがあり、型引数としてstringでそれをインスタンス化したい場合は

あなたはそのようにそれを呼び出すことができます。

var myinstance = Create(typeof(MyClass<>), typeof(string)); 

なお、あなたはリターンを使用したい場合値(myinstance)を効率的に使用するには、おそらくdynamicと宣言する必要があります。

+0

こんにちはルネ、あなたの答えに感謝。これは私がやっていることですが、AOTプラットフォームではジェネリック型がプログラム内のどこにでも宣言されていないとExecutionEngineExceptionがスローされます。私はnownere MakeGenericTypeを使用してMyClassのを作成してあれば、たとえば、私は「MyClassのは」どこにでも私のコードでは、それは動作しません宣言しました。ダミーメソッドに「MyClass 」を追加すると、私の質問に投稿されました。 – Rafael

+0

ああ、それを知らなかった。ここAOTプラットフォームでの経験はありません。申し訳ありませんが、私はあなたを助けなかった。 –

0

完璧なソリューションではありませんが、私はすべての組み合わせ(通常の回避策)のブルートフォースリストよりももっと良いものが一般的なインタフェースとジェネリック抽象クラスで達成することができることを見出しました。

このような、一般的なクラスを作成します。

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へのコンパイルには適しています。リストされている。

関連する問題