有没有一种方法可以检查文件夹中的类,然后自动实例化它们?

时间:2019-06-18 09:44:25

标签: c# oop instantiation

简短地说,我的程序正在比较算法。目前,无论何时添加或删除某些算法,我都必须更改代码。我正在使用C#。

我的想法是只检查目录中的类,然后对该目录中的每个对象在列表中实例化它(或字典,但我还不是很了解这些,但现在让我们说一下列表)。这样,我不必手动添加每种算法,而只需通过从所述文件夹中添加或删除类来添加或删除类。

因此,每当我编译程序时,它都会通过src / model / algorithms进行处理,获取每个属于c#类的文件,然后将该类的实例添加到列表中。

这可能吗,我该怎么做?

2 个答案:

答案 0 :(得分:2)

据我了解,您正在编写一个必须运行某些“算法”的可执行文件。您的算法被实现为存在于可执行程序程序集中的类。您不想对可执行文件必须执行的算法进行硬编码,但希望它们可以被自动发现。

然后只需定义一个接口:

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

现在启动程序scan your assembly for types implementing this interface

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

所以您看到,这与类文件无关。

答案 1 :(得分:0)

首先,您需要从目录中获取所有文件名:

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