委托所有方法

delegate for all methods

我想实现一个 TaskQueue。 我将任务添加到队列中,当我调用 Run() 时,任务将由线程执行。

class Executer
{
    private Queue<Task> TaskQueue;

    private Thread thread;

    public Executer()
    {
        this.TaskQueue = new Queue<QueueNode>();
    }

    public void AddTask(Task task)
    {
        this.TaskQueue.Enqueue(task);
    }

    public void Run()
    {
        this.thread = new Thread(() => ThreadMethod);

        this.thread.Start();
    }
}

ThreadMethod 遍历 Queue 并执行 Tasks.

但我的问题是我找不到 Task 的数据类型,因为 Task 可能是一切。

假设我只想调用带有 int 参数的方法。那么就很简单了.. Task 可能是这样的:

Action<int> Task = object.AddToTheObjectCounter(5);

但这只是无数个案例中的一个。

你能给我小费吗?

我也想过通过

动态调用方法
object.GetType().GetMethod("AddToTheObjectCounter") // ...

但我认为这不太好,因为当我有拼写错误时,代码编译但会崩溃。


提示: 我发现您可以使用可变数量的参数调用委托(查看下面的答案):

private void TestMethod()
{
    Delegate function = (Func<int, int, int>)((a, b) => a * b);
    object[] parameters = new object[] {7, 2};
    var result = (int)function.DynamicInvoke(parameters);
}

您可以使用匿名方法:

void Print(string str) {
    Console.WriteLine("str");
}

var queue = new List<Action> {
    () => Print("Hello"),
    () => Print(" world!"),
    () => {
        Print("Bla bla bla");
        Print("-----------");
    }
};
for each(var task in queue) {
    task();
}

结果将是:

Hello
 world!
Bla bla bla
-----------

嗯,有Delegate

private Queue<Delegate> TaskQueue;
...

public void AddTask(Delegate task)
{
    this.TaskQueue.Enqueue(task);
}

但是,当使用 AddTask 添加任务时,就不会像以前那么容易了。您首先需要转换为已知委托 (Func<>),然后传递一个参数。

obj.AddTask((Func<...>)nameOfTheMethod);
// obj.AddTask((Func<string[], void>)Console.WriteLine);

当你调用Delegate实例时,你不能使用operator(),因为你不确定这个函数到底是什么。您必须改用 DynamicInvoke