Есть ли способ проверить папку на наличие классов, а затем автоматически их создать? - PullRequest
0 голосов
/ 18 июня 2019

Вкратце, моя программа сравнивает алгоритмы.На данный момент я должен изменить код всякий раз, когда я добавляю или удаляю определенные алгоритмы.Я использую C #.

Моя идея состояла в том, чтобы просто проверить классы в каталоге, а затем для каждого объекта в этом каталоге создать его экземпляр в списке (или словаре, но я пока не совсем их понимаю, но длятеперь давайте скажем список).Таким образом, мне не нужно добавлять каждый алгоритм вручную, а можно просто добавлять или удалять классы, добавляя или удаляя их из указанной папки.

Поэтому, когда я компилирую свою программу, она проходит через src / model / алгоритмы,каждый файл, который является классом ac # и затем добавляет экземпляр этого класса в список.

Возможно ли это, и как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Насколько я понимаю, вы пишете исполняемый файл, который должен запускать некоторые "алгоритмы". Ваши алгоритмы реализованы в виде классов, которые живут в сборке вашего исполняемого файла. Вы не хотите жестко задавать алгоритмы, которые должен выполнять исполняемый файл, но вы хотите, чтобы они автоматически обнаруживались.

Затем просто определите интерфейс:

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

Итак, вы видите, это не имеет ничего общего с файлами классов.

0 голосов
/ 18 июня 2019

Сначала вам нужно получить все имена файлов из вашего каталога:

DirectoryInfo d = new DirectoryInfo(@"PATHHERE");
FileInfo[] Files = d.GetFiles("*.cs"); //Getting cs files
string str = "";
foreach(FileInfo file in Files )
{
  //USE THE "file.Name" TO INSTANTIATE THE CLASS (CHECK THE CODE ABOVE)
}

Теперь для каждого имени вы можете использовать Activator.CreateInstance ():

myObject = (MyAbstractClass)Activator.CreateInstance("AssemblyName", "TypeName");

или

var type = Type.GetType("MyFullyQualifiedTypeName");
var myObject = (MyAbstractClass)Activator.CreateInstance(type);
...