Search code examples
c#stringclassinstantiation

Instantiate a class from its textual name


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.


Solution

  • 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);
    }