Насколько я понимаю, вы пишете исполняемый файл, который должен запускать некоторые "алгоритмы". Ваши алгоритмы реализованы в виде классов, которые живут в сборке вашего исполняемого файла. Вы не хотите жестко задавать алгоритмы, которые должен выполнять исполняемый файл, но вы хотите, чтобы они автоматически обнаруживались.
Затем просто определите интерфейс:
public interface IAlgorithm
{
string Name { get; }
void Execute();
}
И пусть ваши алгоритмы реализуют этот интерфейс:
public class FooAlgorithm : IAlgorithm
{
public string Name => "Foo";
public void Execute()
{
Console.WriteLine("Fooing the foo");
}
}
public class BarAlgorithm : IAlgorithm
{
public string Name => "Bar";
public void Execute()
{
Console.WriteLine("Barring the bar");
}
}
Теперь при запуске программы сканирует вашу сборку на наличие типов, реализующих этот интерфейс :
var algorithmTypes = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => typeof(IAlgorithm).IsAssignableFrom(p))
.ToList();
foreach (var algorithmType in algorithmTypes )
{
var algorithm = (IAlgorithm)Activator.CreateInstance(algorithmType);
Console.WriteLine($"Executing algorithm '{algorithm.Name}'...");
algorithm.Execute();
}
Итак, вы видите, это не имеет ничего общего с файлами классов.