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