.NET泛型类实例 - 传递可变数据类型

nat*_*ere 4 c# vb.net generics reflection dynamic-typing

正如标题所示,我想将可变数据类型传递给模板类.像这样的东西:

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!
Run Code Online (Sandbox Code Playgroud)
LookupForm<Models.MyClass> frmExample;
Type SelectedType = InstanceOfMyClass.GetType();
frmExample = new LookupForm<SelectedType.GetType()>(); //Ba-bow
frmExample = new LookupForm<(Type)SelectedType>(); //Ba-bow
Run Code Online (Sandbox Code Playgroud)

我假设它与在编译时处理的模板有关,但即使我在那里没有标记,它也无法解决我的问题.我找不到有关使用Reflection实例模板类的任何相关信息.

(如何)我可以在运行时创建动态类型存储库的实例吗?

Mat*_*ell 9

东西很接近的C#示例位于这里的一个问题,我有:

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

转换为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(){})
Run Code Online (Sandbox Code Playgroud)

(啊,出于某种原因,我以为你想在VB.NET中使用它,但这里是一个C#示例)

LookupForm<Models.MyClass> frmExample;
Type SelectedType = InstanceOfMyClass.GetType();   
Type GenericLookupType = typeof(LookupForm<>).MakeGenericType(SelectedType);
frmExample = Activator.CreateInstance(GenericLookupType, new object[]{});
Run Code Online (Sandbox Code Playgroud)


Igo*_*aka 6

使用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!!!
Run Code Online (Sandbox Code Playgroud)

和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!!!'
Run Code Online (Sandbox Code Playgroud)