45

Don't ask me why but I need to do the following:

string ClassName = "SomeClassName";  
object o = MagicallyCreateInstance("SomeClassName");

I want to know how many ways there are to do this is and which approach to use in which scenario.

Examples:

  • Activator.CreateInstance
  • Assembly.GetExecutingAssembly.CreateInstance("")
  • Any other suggestions would be appreciated

This question is not meant to be an open ended discussion because I am sure there are only so many ways this can be achieved.

peter-b
  • 4,073
  • 6
  • 31
  • 43
Raheel Khan
  • 14,205
  • 13
  • 80
  • 168

3 Answers3

60

Here's what the method may look like:

private static object MagicallyCreateInstance(string className)
{
    var assembly = Assembly.GetExecutingAssembly();

    var type = assembly.GetTypes()
        .First(t => t.Name == className);

    return Activator.CreateInstance(type);
}

The code above assumes that:

  • you are looking for a class that is in the currently executing assembly (this can be adjusted - just change assembly to whatever you need)
  • there is exactly one class with the name you are looking for in that assembly
  • the class has a default constructor

Update:

Here's how to get all the classes that derive from a given class (and are defined in the same assembly):

private static IEnumerable<Type> GetDerivedTypesFor(Type baseType)
{
    var assembly = Assembly.GetExecutingAssembly();

    return assembly.GetTypes()
        .Where(baseType.IsAssignableFrom)
        .Where(t => baseType != t);
}
Cristian Lupascu
  • 39,078
  • 16
  • 100
  • 137
20
Activator.CreateInstance(Type.GetType("SomeNamespace.SomeClassName"));

or

Activator.CreateInstance(null, "SomeNamespace.SomeClassName").Unwrap();

There are also overloads where you can specify constructor arguments.

Balazs Tihanyi
  • 6,659
  • 5
  • 23
  • 24
0

Use this way to use the class name without the fully qualified namespace:

System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("myclass");
AecorSoft
  • 414
  • 4
  • 10