Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 367
Raheel Khan Avatar asked Mar 24 '12 19:03

Raheel Khan


People also ask

How do you instantiate the class?

Instantiating a ClassThe new operator requires a single, postfix argument: a call to a constructor. The name of the constructor provides the name of the class to instantiate. The new operator returns a reference to the object it created.

What is instantiating the class?

Instantiation is the creation of a new instance of a class and is part of object-oriented programming, which is when an object is an instance of a class. Think of the generic employee. When a true employee is hired, they inherit the properties of the generic Employee class.


1 Answers

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); } 
like image 171
Cristian Lupascu Avatar answered Oct 05 '22 01:10

Cristian Lupascu