代码之家  ›  专栏  ›  技术社区  ›  fastbyte22

如何以适当的方式使这个IEnumerator通用?

  •  0
  • fastbyte22  · 技术社区  · 2 年前

    在团结中,我有以下几次郊游:

    IEnumerator DoActionUponReachingRangeCoroutine(Range range, Delegate action, params object[] args)
    {
        yield return new WaitUntil(() => range.isPlayerInRange);
        action.DynamicInvoke(args);
        yield return null;
    }
    

    正如你所看到的,它可以在射程内执行一些动作。满足IsPlayerInRange条件。我想做完全相同的事情,但每次调用此方法时都提供我自己的条件,而不是使用isPlayerInRange硬编码。 我只是提供一个代表而不是范围吗?

    1 回复  |  直到 2 年前
        1
  •  2
  •   Marc Gravell    2 年前

    WaitUntil takes Func<bool> ,所以您可以简单地将其传递下去:

    IEnumerator DoActionUponCoroutine(Func<bool> predicate, Delegate action, params object[] args)
    {
        yield return new WaitUntil(predicate);
        action.DynamicInvoke(args);
        yield return null;
    }
    

    你可能也更喜欢 Action 对于回调,这比 DynamicInvoke :

    IEnumerator DoActionUponCoroutine(Func<bool> predicate, Action action)
    {
        yield return new WaitUntil(predicate);
        action();
        yield return null;
    }
    

    还有一种使用泛型的方法 TState state 和一个 Action<TState> 回调以避免捕获上下文,但是。。。这是一个更高级的场景。