DEV Community

loading...
Cover image for Dynamically getting objects from an assembly in C#

Dynamically getting objects from an assembly in C#

Talles L
A Brazilian software developer ๐Ÿ‡ง๐Ÿ‡ท that loves to play video-games ๐ŸŽฎ, tries it best to be active on GitHub ๐Ÿ’ป, and sometimes writes here on DEV ๐Ÿ“„
ใƒปUpdated on ใƒป2 min read

To avoid those repetitive codes that 'registers' types of a class or interface you can use a bit of reflection and dynamically find and instantiate those.

First, list all the types (GetTypes) from the current assembly (GetExecutingAssembly):

var types = Assembly.GetExecutingAssembly().GetTypes();
Enter fullscreen mode Exit fullscreen mode

Then filter by whatever type you want with IsAssignableFrom:

var filteredTypes = types.Where(t => typeof(MyType).IsAssignableFrom(t));
Enter fullscreen mode Exit fullscreen mode

And lastly instantiate those with the good old Activator.CreateInstance:

var instances = filteredTypes.Select(t => (MyType)Activator.CreateInstance(t));
Enter fullscreen mode Exit fullscreen mode

Below goes a working example of such approach. Note that there are many potential edge cases in play here, patch the code accordingly to your needs.

using System;
using System.Linq;
using System.Reflection;

// No "class Program" or "static void Main"
// C# 9 top-level statements!

// Watch out for some potential pitfalls of using Activator.CreateInstance such as:
// - runtime error when class doesn't have a parameterless constructor
// - can be a costly method call
static T Instantiate<T>(Type t) => (T)Activator.CreateInstance(t);

static bool IsGreeter(Type t) => typeof(IGreeter).IsAssignableFrom(t) && t.IsClass;

// Use AppDomain.CurrentDomain.GetAssemblies() for other assemblies than the current one
var types = Assembly.GetExecutingAssembly().GetTypes().Where(IsGreeter);
var instances = types.Select(Instantiate<IGreeter>);

// Prints:
// "Hello, I'm Anna."
// "Hi, Joe here."
// "Woof!"
foreach (var i in instances)
    i.Greeting();

public interface IGreeter
{
    void Greeting();
}

public class Anna : IGreeter
{
    public void Greeting() => Console.WriteLine("Hello, I'm Anna.");
}

public class Joe : IGreeter
{
    public void Greeting() => Console.WriteLine("Hi, Joe here.");
}

public class Dog : IGreeter
{
    public void Greeting() => Console.WriteLine("Woof!");
}
Enter fullscreen mode Exit fullscreen mode

Discussion (0)