Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法检查文件夹中的类,然后自动实例化它们?_C#_Oop_Instantiation - Fatal编程技术网

C# 有没有办法检查文件夹中的类,然后自动实例化它们?

C# 有没有办法检查文件夹中的类,然后自动实例化它们?,c#,oop,instantiation,C#,Oop,Instantiation,我的程序是,简短地说,比较算法。目前,每当我添加或删除某些算法时,我都必须更改代码。我用的是C# 我的想法是只检查目录中的类,然后在列表(或字典)中实例化该目录中的每个对象(但我还不太了解这些,但现在让我们说列表)。这样我就不必手动添加每一个算法,只需通过从所述文件夹中添加或删除类来添加或删除类 因此,每当我编译我的程序时,它都会通过src/model/algorithms,获取每个c#类文件,然后将该类的一个实例添加到列表中 这可能吗?我该怎么做?首先,您需要从目录中获取所有文件名: Dire

我的程序是,简短地说,比较算法。目前,每当我添加或删除某些算法时,我都必须更改代码。我用的是C#

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

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


这可能吗?我该怎么做?

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

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


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

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


据我所知,您正在编写一个必须运行一些“算法”的可执行文件。您的算法是作为类实现的,这些类存在于可执行程序的程序集中。您不想硬编码可执行文件必须执行哪些算法,但希望它们能够自动发现

然后简单地定义一个接口:

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");
    }
}
并让您的算法实现此接口:

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");
    }
}
现在,在程序启动时:


你看,这与类文件无关。

据我所知,你正在编写一个必须运行一些“算法”的可执行文件。您的算法是作为类实现的,这些类存在于可执行程序的程序集中。您不想硬编码可执行文件必须执行哪些算法,但希望它们能够自动发现

然后简单地定义一个接口:

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");
    }
}
并让您的算法实现此接口:

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");
    }
}
现在,在程序启动时:


你看,这与类文件无关。

目录如何包含“类”?你想按需编译C#文件吗?或者你想要一个插件式的系统,根据需要加载包含类的程序集?这两个问题之前都已经问过了,请尝试搜索。每当我编译我的程序时,我都想检查src/model/algorithms中是否包含类文件,然后实例化这些文件。我试着研究一下,但没有发现任何东西你真的需要更好地描述你的场景。是否要将源文件与可执行文件一起交付?我想不是。这听起来像是个XY问题。这与源文件无关。我认为您想要的是找到可执行文件中的所有“算法”类型。为此,要么将某个名称空间列为白名单,要么让所有算法实现某个接口。然后在应用程序启动时,扫描该名称空间或接口的所有类型,并实例化它们。@CodeCaster我很惊讶。我开始这样想,我知道一点,在完全不理解你所说的之后,我确信我实际上什么都不知道。向我所有的功能解释一下,我想按f5,我不想手动实例化每个算法,我想让控制器实例化我的/algorithms/folder中的所有内容,关键是你的可执行文件与你的源文件没有关系。它们被编译到您的可执行文件中,您不希望将源文件与可执行文件一起交付。根本没有必要这么做。请看下面我的答案,并检查这是否符合您的要求。目录如何包含“类”?你想按需编译C#文件吗?或者你想要一个插件式的系统,根据需要加载包含类的程序集?这两个问题之前都已经问过了,请尝试搜索。每当我编译我的程序时,我都想检查src/model/algorithms中是否包含类文件,然后实例化这些文件。我试着研究一下,但没有发现任何东西你真的需要更好地描述你的场景。是否要将源文件与可执行文件一起交付?我想不是。这听起来像是个XY问题。这与源文件无关。我认为您想要的是找到可执行文件中的所有“算法”类型。为此,要么将某个名称空间列为白名单,要么让所有算法实现某个接口。然后在应用程序启动时,扫描该名称空间或接口的所有类型,并实例化它们。@CodeCaster我很惊讶。我开始这样想,我知道一点,在完全不理解你所说的之后,我确信我实际上什么都不知道。向我所有的功能解释一下,我想按f5,我不想手动实例化每个算法,我想让控制器实例化我的/algorithms/folder中的所有内容,关键是你的可执行文件与你的源文件没有关系。它们被编译到您的可执行文件中,您不希望将源文件与可执行文件一起交付。根本没有必要这么做。请参阅下面我的答案,并检查这是否符合您的要求。除了文件名不必与其包含的类名相对应外,文件可以为空,或者文件可以包含多个类(或结构或接口),您不希望仅为了启用此功能而将源文件与可执行文件一起交付。@CodeCaster我并没有提供完整的解决方案,它只是一个示例,用于阐明总体思路(即使是因为所询问的场景处于较高级别,缺乏详细信息)。除了文件名不必与它包含的类名相对应外,一个文件可以是空的,或者一个文件可以包含多个类(或结构或接口),并且您不希望为了启用此功能而将源文件与可执行文件一起交付。@CodeCaster我没有提供完整的解决方案,这只是一个简单的例子,用以阐明一般的观点(e