如何使用反射或替代方法以编程方式创建函数调用?

wma*_*ard 8 c# reflection

我有点像反射的新手.我希望有可能做我想做的事情.我一直在通过ProjectEuler学习语言,我有一个名为Problem的基类.每个PE问题都是一个单独的类,即Problem16.要运行我的计算,我使用以下代码:

using System;
using Euler.Problems;
using Euler.Library;

namespace Euler
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Problem prob = new Problem27();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在已经完成了50个问题,我想创建一个循环来运行它们.我的基类问题有一个方法,它在文本文件中附加问题编号,答案和在每个类的默认构造函数中调用的执行时间.我可以手动更改所有50的函数调用,但是当我继续完成问题时,这将最终成为很多工作.

我宁愿以编程方式来做.我希望这个伪代码成为现实:

for (int i = 1; i <= 50; i++)
{
    string statement = "Problem prob = new Problem" + i + "();";
    // Execute statement
}
Run Code Online (Sandbox Code Playgroud)

use*_*107 10

有了反思,你可以做更好的事情.

例如,声明一个接口

interface IEulerProblem 
{
   void SolveProblem();
}
Run Code Online (Sandbox Code Playgroud)

编写从IEulerProblem派生的类.

然后你可以运行(技术上)一行很好的代码:

Assembly.GetEntryAssembly()
        .GetTypes()
        .Where(t => typeof(IEulerProblem).IsAssignableFrom(t))
        .Where(t => !t.IsInterface && !t.IsAbstract)
        .Select(t => Activator.CreateInstance(t) as IEulerProblem)
        .OrderBy(t => t.GetType().Name).ToList()
        .ForEach(p => p.SolveProblem());
Run Code Online (Sandbox Code Playgroud)

  • @Oliver你知道吗只需要[安装Gentoo的三个命令](http://bash.org/?464385)? (2认同)