我有以下结构,其中包含一个 Action 和一个 T 参数:
public struct CallbackInfo<T>
{
public readonly Action<T> callback;
public readonly T param;
}
我想做的是存储这些callbackInfo结构的列表,当然,在某个时间点回调。
假设我按如下方式存储这些结构:
public class CallbacksSystem<T>
{
List<CallbackInfo<T>> callbacks;
public void AddCallback<T>(T callback)
{
callbacks.Add(callback);
}
public void RunCallbacks()
{
foreach(CallbackInfo<T> info in callbacks) info.callback(info.param);
}
}
但是,这意味着我需要为每个需要提交回调的不同 T 拥有一个新的 CallbackSystem。
C# 中是否有一种方法可以将列表存储为通配符并在运行时获取具体类型来运行回调操作?
最佳答案
正如其他人提到的,您的问题可以通过 Events 来解决
如果事件不能解决您的整个问题,我很抱歉地报告在这种情况下不存在通配符泛型。然而,也许 lambda 驱动的方法就足够了。
提案 1
这里,代码通过在 lambda 中捕获状态和回调将它们绑定(bind)在一起。然后,这个 lambda 会像匿名函数一样保存在列表中。
public class CallbacksSystem
{
private List<Action> Callbacks { get; } = new List<Action>();
public void AddCallback<T>(Action<T> callback, T parameter) // Or with your struct
{
Callbacks.Add(() => callback(parameter));
}
public void RunCallbacks()
{
foreach(var callback in Callbacks) callback();
}
}
提案2
如果您有此模式的多个实例,其中本地有一个需要使用累积参数多次调用的函数,您可以创建一个如下所示的类:
public class DeferredCallback<T>
{
public DeferredCallback(Action<T> callback)
{
Callback = callback;
}
private Action<T> Callback { get; }
private List<T> Parameters { get; } = new List<T>();
public void AddDeferredCall(T parameter)
{
Parameters.Add(parameter);
}
public void RunCallbacks()
{
foreach(var parameter in Parameters) Callback(parameter);
}
}
然后,您将为每个回调实例化该类一次。最适合的方法完全取决于问题的其余部分(以及系统)的外观,但这些示例有望让您走上正确的道路(?)。
关于c# - 具有任何类型回调的通配符泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62395908/