gpt4 book ai didi

c# - 将任务与反射(reflection)相结合

转载 作者:行者123 更新时间:2023-11-30 20:04:00 33 4
gpt4 key购买 nike

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

对于这个例子,我有两个可以作为任务运行的静态方法。 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 语句,因为我可能有很多方法可以分配给一个任务。

最佳答案

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

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

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

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

关于c# - 将任务与反射(reflection)相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13809202/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com