动作/函数的通用列表

本文关键字:列表 函数 动作 | 更新日期: 2023-09-27 18:08:12

我想知道是否有可能创建某种通用的动作/函数列表,每个都有不同的输入/输出参数。

我需要这个的原因是我有一个执行器,他的工作是从API中获取数据,该执行器中的每个方法都到该API中的不同路径,我希望能够调度这些请求,这样我就不会重载该API(如果我超过请求的阈值,它们只会阻止我)。

因此,每当执行器中的方法被调用时,我会将该方法及其参数添加到列表中,另一个线程将运行该列表并使用超时从那里执行方法。

我必须在执行程序中使用这个逻辑,而不是从它的调用程序中使用。

所以我想知道我是否可以这样做:

List<Func<T,T>> scheduler;

没有在创建时声明类型,而是在运行时添加不同的类型。

如果有更好的解决方案或模式,请告诉我。

[编辑]显然我不想实现这样的东西:

Func<List<object>, object> scheduler

动作/函数的通用列表

您可以创建一个List<Tuple<Type, Delegate>>来存储您的函数。

下面的代码运行正常:

var scheduler = new List<Tuple<Type, Delegate>>();
scheduler.Add(
    Tuple.Create<Type, Delegate>(
        typeof(Func<int, int>),
        (Func<int, int>)(n => n + 1)));
scheduler.Add(
    Tuple.Create<Type, Delegate>(
        typeof(Func<string, string, int>),
        (Func<string, string, int>)((x, y) => x.Length + y.Length)));

你需要用反射把它们从一个Delegate带回来。

如果您在将函数添加到列表时知道参数值,则可以简单地在应用Func<T, X, Y, Z ...>的lambda中捕获它们,从而将其减少为Func<T>,,例如

Func<T, X> funcToAdd = ...
Func<T> wrapper = () => funcToAdd(valueForX);
myFuncList.Add(wrapper);

函数列表的类型可以是List<Func<T>>