3

Assuming I have only the class name of a generic as a string in the form of "MyCustomGenericCollection(of MyCustomObjectClass)" and don't know the assembly it comes from, what is the easiest way to create an instance of that object?

If it helps, I know that the class implements IMyCustomInterface and is from an assembly loaded into the current AppDomain.

Markus Olsson gave an excellent example here, but I don't see how to apply it to generics.

Community
  • 1
  • 1
Yes - that Jake.
  • 16,725
  • 14
  • 70
  • 96

3 Answers3

8

Once you parse it up, use Type.GetType(string) to get a reference to the types involved, then use Type.MakeGenericType(Type[]) to construct the specific generic type you need. Then, use Type.GetConstructor(Type[]) to get a reference to a constructor for the specific generic type, and finally call ConstructorInfo.Invoke to get an instance of the object.

Type t1 = Type.GetType("MyCustomGenericCollection");
Type t2 = Type.GetType("MyCustomObjectClass");
Type t3 = t1.MakeGenericType(new Type[] { t2 });
ConstructorInfo ci = t3.GetConstructor(Type.EmptyTypes);
object obj = ci.Invoke(null);
Jonathan Rupp
  • 15,522
  • 5
  • 45
  • 61
2

The MSDN article How to: Examine and Instantiate Generic Types with Reflection describes how you can use Reflection to create an instance of a generic Type. Using that in conjunction with Marksus's sample should hopefully get you started.

Andy
  • 30,088
  • 6
  • 78
  • 89
1

If you don't mind translating to VB.NET, something like this should work

foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
    // find the type of the item
    Type itemType = assembly.GetType("MyCustomObjectClass", false);
    // if we didnt find it, go to the next assembly
    if (itemType == null)
    {
        continue;
    }
    // Now create a generic type for the collection
    Type colType = assembly.GetType("MyCusomgGenericCollection").MakeGenericType(itemType);;

    IMyCustomInterface result = (IMyCustomInterface)Activator.CreateInstance(colType);
    break;
}
David Wengier
  • 10,061
  • 5
  • 39
  • 43