Search code examples
c#vb.netgenericsreflectiondynamic-typing

.NET generic class instance - passing a variable data type


As the title suggests, I'm tyring to pass a variable data type to a template class. Something like this:

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

I'm assuming it's something to do with the template being processed at compile time but even if I'm off the mark there, it wouldn't solve my problem anyway. I can't find any relevant information on using Reflection to instance template classes either.

(How) can I create an instance of a dynamically typed repository at runtime?


Solution

  • A C# example of something pretty close is located here on a question I had:

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

    Converting to VB.NET, changing it to type creation not method invocation and using your example names for you:

    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(){})
    

    (Ah for some reason I thought you wanted it in VB.NET but here is a C# example)

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