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实例模板类的任何相关信息.
(如何)我可以在运行时创建动态类型存储库的实例吗?
东西很接近的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)
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)