委托所有方法
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
并执行 Task
s.
但我的问题是我找不到 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
。
我想实现一个 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
并执行 Task
s.
但我的问题是我找不到 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
。