接受任何类型作为委托参数
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)
{
}
}
我正在尝试建立一个系统,让我可以轻松地在 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)
{
}
}