4

タイトルが示すように、私は可変データ型をテンプレートクラスに渡すのに疲れています。このようなもの:

frmExample = New LookupForm(Of Models.MyClass) 'Works fine

Dim SelectedType As Type = InstanceOfMyClass.GetType() 'Works fine
frmExample = New LookupForm(Of SelectedType) 'Ba-bow!
frmExample = New LookupForm(Of InstanceOfMyClass.GetType()) 'Ba-bow!

LookupForm<Models.MyClass> frmExample;
Type SelectedType = InstanceOfMyClass.GetType();
frmExample = new LookupForm<SelectedType.GetType()>(); //Ba-bow
frmExample = new LookupForm<(Type)SelectedType>(); //Ba-bow

コンパイル時に処理されるテンプレートと関係があると思いますが、そこにマークが付いていなくても、とにかく問題は解決しません。Reflectionを使用してテンプレートクラスをインスタンス化することに関する関連情報も見つかりません。

(どのように)実行時に動的に型付けされたリポジトリのインスタンスを作成できますか?

4

4 に答える 4

9

かなり近いもののAC#の例は、私が持っていた質問にあります。

typeof(MyClass).GetMethod("Foo").MakeGenericMethod(new[] { param.GetType() }).Invoke(null, new[] { param });

VB.NETに変換し、メソッド呼び出しではなくタイプ作成に変更し、サンプル名を使用します。

Dim frmExample as LookupForm<Models.MyClass>;
Dim SelectedType as Type = InstanceOfMyClass.GetType();   
Dim GenericLookupType as Type = GetType(LookupForm(Of)).MakeGenericType(SelectedType)
frmExample = Activator.CreateInstance(GenericLookupType, new object(){})

(ああ、どういうわけか、VB.NETでそれが欲しいと思っていましたが、ここにC#の例があります)

LookupForm<Models.MyClass> frmExample;
Type SelectedType = InstanceOfMyClass.GetType();   
Type GenericLookupType = typeof(LookupForm<>).MakeGenericType(SelectedType);
frmExample = Activator.CreateInstance(GenericLookupType, new object[]{});
于 2010-06-02T01:33:18.030 に答える
7

を使用しType.MakeGenericTypeます。

Type modelType = typeof(Models.MyClass);
var repoType = typeof(LookupForm<>).MakeGenericType(new [] {modelType} );
//at this point repoType == typeof(LookupForm<Models.MyClass>);
var repo = Activator.CreateInstance(repoType );
//Ta-dah!!!

そしてVB.NETバージョン:)

    Dim modelType As Type = GetType(Models.MyClass)
    Dim repoType As Type = GetType(LookupForm(Of )).MakeGenericType(New Type() {modelType})
    'at this point repoType = GetType(LookupForm(of Models.MyClass))'
    Dim repo = Activator.CreateInstance(repoType)
    'Ta-dah!!!'
于 2010-06-02T01:29:16.073 に答える
1

残念ながら、これは反省なしでは実行できず、それでもあまり友好的ではありません。リフレクションコードは次のようになります。

Type baseType = typeof(LookupForm<>);
Type selectedType = InstanceOfMyClass.GetType(); //or however else you want to get hold of it
Type genericType = baseType.MakeGenericType(new Type[] { selectedType });
object o = Activator.CreateInstance(genericType);

もちろん、オブジェクトを何にキャストするかはわかりませんが(selectedType動的に設定されていると仮定)、リフレクションを介してオブジェクトのメソッドを呼び出すことも、非ジェネリックインターフェイスを作成してオブジェクトをキャストしてメソッドを呼び出すこともできます。その上で。

于 2010-06-02T01:37:32.030 に答える
1

これは、動的言語ランタイム、C#の「動的」タイプの候補のように聞こえますが、.NET4.0を使用する必要があります

于 2010-06-02T01:20:45.883 に答える