接受任何类型作为委托参数

Accept any type as delegate parameter

我正在尝试建立一个系统,让我可以轻松地在 Unity3D(在 C# 中)中设置延迟,在没有任何参数或简单参数的情况下执行此操作就可以正常工作,但我希望系统是足够灵活以允许任何类型的回调。

例如,在 Start 方法中它应该在 5 秒后调用 PrintString:

public string str = "something";
void Start(){
    SB.Delay(5, PrintString, str);
}

public void PrintString(string pr){
    Debug.Log(pr);
}

Delay 方法创建一个新的 SBTimer,并将其添加到 SBTimer 列表中。然后我在其他地方遍历该列表以 运行 所有

public static void Delay<T>(float delay, SBTimer.CallbackParam<T> cb, T arg){
    delays.Add(new SBTimer(delay, cb, arg));
}

这就是问题所在,我不知道如何进行。这是 SBTimer class,或者至少我希望它如何工作:

public class SBTimer{
public delegate void Callback();
public Callback _callback = null;

public delegate void CallbackParam<T>(T arg);
public Callback _callbackparam = null;
public T _arg;


public float _delay = 0f;

public SBTimer(float delay, Callback cb){
    _delay = delay;
    _callback = cb;
}

public SBTimer(float delay, CallbackParam<T> cb, T arg){
    _delay = delay;
    _callback = cb;
    _arg = arg;
}

public DoUpdate(){ //stuff here }
}

到目前为止,我使它起作用的唯一方法是将 SBTimer 设为通用 class,但这会使更新循环复杂化(现在就是这样:)

void Update () {
    SB.OnUpdate();
}

有谁知道如何解决这个问题或者可能知道获得类似结果的不同方法?

这种类型不用费心去支持。只需接受 Action 并且不支持其他代表。如果调用者想调用一个有参数的方法并提供这些参数,他们可以使用 lambda 来关闭有问题的值,给你你的 Action 但实际上在调用时调用他们想要的方法:

public class SBTimer
{
    private Action callback;
    private float delay;

    public SBTimer(float delay, Action callback)
    {
        this.delay = delay;
        this.callback = callback;
    }
    //todo actual implementation
}

public class Foo
{
    public string str = "something";
    void Start()
    {
        new SBTimer(5, () => PrintString(str));
    }

    public void PrintString(string pr)
    {
    }
}