AngryHacker
AngryHacker

Reputation: 61606

How to reflect over assemblies that are already loaded?

I have 2 projects in the solution. Project1UI references Project2Reports

Project1UI:
  MainForm.cs

Project2Reports:
  BaseReport.cs  // all classes below inherit from it
  Report1.cs
  Report2.cs
  Report3.cs

From Project1UI, how can I find all the classes that inherit from BaseReport? The project1UI already references the 2nd assembly - is there a way to do it without manually loading the 2nd assembly manually (e.g. Assembly.Load) since it's already loaded.

Upvotes: 0

Views: 111

Answers (1)

Salvatore Previti
Salvatore Previti

Reputation: 9050

You have to process all the types in the assembly and look for the types that implement it.

You can use something like that (written by hand right now, it may contains errors).

foreach (Type type in Assembly.GetAssembly(typeof(BaseReport)).GetTypes())
{
    if (type != typeof(BaseReport) && typeof(BaseReport).IsAssignableFrom(type))
    {
        // we found a type, we can store it somewhere, for example, in a list and our list in a static readonly field for fast lookup in the future.
        myreports.Add(type);
    }
}

You can also process all the loaded assemblies.

This however is not the best way to do that, is complicated, quite obscure and quite hard to understand. I would use a simple factory class that will give you the instance of your report as requested, when you add a report, add it through a simple .Add call.

Upvotes: 1

Related Questions