簡體   English   中英

如何使用反射或替代方法以編程方式創建函數調用?

[英]How can I use reflection or alternative to create function calls programatically?

我有點像反射的新手。 我希望有可能做我想做的事情。 我一直在通過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();
        }
    }
}

我現在已經完成了50個問題,我想創建一個循環來運行它們。 我的基類問題有一個方法,它在文本文件中附加問題編號,答案和在每個類的默認構造函數中調用的執行時間。 我可以手動更改所有50的函數調用,但是當我繼續完成問題時,這將最終成為很多工作。

我寧願以編程方式來做。 我希望這個偽代碼成為現實:

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

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

例如,聲明一個接口

interface IEulerProblem 
{
   void SolveProblem();
}

編寫從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());

首先看一下Get的所有繼承類,它們也適用於非抽象類。

然后,您只需在基類上調用每個方法。

foreach (problem p in problems)
{
  p.MyMethod()
}

是的,這是可能的,您需要閱讀MethodInfo.Invoke: http//msdn.microsoft.com/en-us/library/system.reflection.methodinfo.invoke.aspx

var problems = Assembly.GetExecutingAssembly().GetTypes()
                       .Where(t => !t.IsAbstract && typeof(Problem).IsAssignableFrom(t));

foreach(var p in problems)
{
    var euler = Activator.CreateInstance(p) as Problem;
    euler.Solve(); // ??
}

作為可能的解決方案之一,我想建議在不使用反射的情況下創建構造函數委托列表。
您仍然需要填充列表50次,但只需填充一次。 您將擁有類型安全性,並且可以為每個派生類指定不同的構造函數。 像這樣的東西:

 List<Func<Test>> tests = new List<Func<Test>>();
            tests.Add(() => new Test1());
            tests.Add(() => new Test2());
            foreach (var constructor in tests)
            {
                Test test = constructor();
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM