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

时间:2015-05-05 17:05:08

标签: c# unity3d delegates

我试图建立一个允许我在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课程,或者至少我喜欢它如何工作:

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设为泛型类,但这会使更新循环复杂化(现在就是这样:)

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

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

1 个答案:

答案 0 :(得分:1)

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

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)
    {
    }
}