【问题标题】:Combining Tasks with Reflection将任务与反射相结合
【发布时间】:2012-12-11 05:16:05
【问题描述】:

我有一个提供字符串列表的情况。列表中的第一个条目是方法的名称。列表中剩余的字符串是方法参数。我想使用一个任务来运行该方法(用于教育目的)。我在找出允许我将方法名称输入任务指令的正确过程时遇到问题。

对于这个例子,我有两个可以作为任务运行的静态方法。 args[1] 会 表示我的选择。

public class Program
{
    private static ILog log = LogManager.GetLogger 
                    (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    static void Main(string[] args)
    {
        string whichPrint = args[1];

        Type type = typeof(Program);
        MethodInfo meth = type.GetMethod(whichPrint, BindingFlags.Public | 
                                                           BindingFlags.Static);

        //this is the problem area....how do I feed the the method or delegate into 
        //the lambda expression ????
        Delegate methDel = meth.CreateDelegate(type);
        Task t = Task.Factory.StartNew(() => methDel("help!!"));

    }

    static void printme1(string s)
    {
        log.Debug("Printme1 Printing: " + s);
    }

    static void printme2(string s)
    {
        log.Debug("Printme2 Printing: " + s);
    }
}

我无法编译,因为 methDel 被视为变量。我需要它,或者别的什么, 被视为一种方法。我不想使用 case/switch 语句,因为我可能有很多方法可以分配给任务。

【问题讨论】:

标签: c# reflection task-parallel-library .net-4.5


【解决方案1】:

您将要使用它创建一个新任务这一事实有些无关紧要。您需要做的就是弄清楚如何调用该方法,剩下的就是“启动一个新任务然后调用该方法”。

所以你可能想要这样的东西:

public static void CallMethod(List<string> nameAndArguments)
{
    var method = typeof(Program).GetMethod(nameAndArguments[0]);
    method.Invoke(null, nameAndArguments.Skip(1).ToArray()):
}

然后:

Task.Factory.StartNew(() => CallMethod(nameAndArguments));

我认为不值得建立一个委托,除非您试图通过很多次调用该委托来获得更好的性能。

【讨论】:

    【解决方案2】:

    我认为您在这里不需要委托 - 只需在 Action 主体中调用方法即可。此外,您的方法是私有的,而不是公开的:

    MethodInfo meth = type.GetMethod(whichPrint, BindingFlags.NonPublic |
                                                 BindingFlags.Static);
    Task t = Task.Factory.StartNew(() => meth.Invoke(null, new object[] {"help!!"}));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多