对于返回自身的Func<T>来说,正确的“T”是什么?

c#

一个返回值的函数:

public object ReturnValue() { return new object(); }
Func<object> funcReturnValue = ReturnValue;

一个返回一个返回值的函数的函数:

public Func<object> ReturnFunc() { return ReturnValue; }
Func<Func<object>> funcReturnFunc = ReturnFunc;

到现在为止还挺好。我在使用返回自身的函数时遇到问题:

public *something* ReturnSelf() { return ReturnSelf; }
Func<*something*> funcReturnSelf = ReturnSelf;

显然,*something*将是Func<T>某种形式,但我不确定是什么。乍一看,我猜这将是无限递归的,因为ReturnSelf
返回一个函数,该函数返回一个返回函数的函数......

上下文:使用状态函数的状态机。使用类变量来保持当前状态可以正常工作:

private Action _currentState;

private void StateOne() {
    if (IsTuesday) {
        _currentState = StateTwo;
    }
}

prvivate void StateTwo() {
    if (IsRaining) {
        _currentState = StateOne;
    }
}

private void StateEngine() {
    while (true) {
        _currentState();
        // set tuesday/raining/etc.
    }
}

...但这感觉太像将状态保持在全局中。我更喜欢更接近的东西:

private Func<*somthing*> StateOne() {
    if (IsTuesday) {
        return StateTwo;
    } else {
        return StateOne;
    }
}

prvivate Func<*something*> StateTwo() {
    if (IsRaining) {
        return StateOne;
    } else {
        return StateTwo;
    }
}

private void StateEngine() {
    Func<*something*> currentState = StateOne;
    while (true) {
        Func<*something*> nextState = currentState();
        // set tuesday/raining/etc.
        currentState = nextState;
    }
}

有任何想法吗?还是我应该坚持使用有效的解决方案?

回答

Func<T>您可以定义delegate返回该delegate类型值的a来代替使用。委托可用于将函数引用作为参数传递给另一个函数,或者在这种情况下从函数 ( docs )返回函数引用。

例子:

class Program
{

  private delegate StateDelegate StateDelegate();

  public static void Main(string[] args)
  {
    Program program = new Program();
    StateDelegate stateHandler = program.HandleStateOne;
    
    // Execute HandleStateOne, returns HandleStateTwo
    stateHandler = stateHandler.Invoke(); 

    // Execute HandleStateTwo, returns reference to HandleStateOne    
    stateHandler = stateHandler.Invoke();
  }

  private StateDelegate HandleStateOne()
  {
    // Do something state specific...
    return HandleStateTwo;
  }

  private StateDelegate HandleStateTwo()
  {
    // Do something state specific...
    return HandleStateOne;
  }

  // Literally return reference to the function itself
  private StateDelegate ReturnSelf()
  {
    return ReturnSelf;
  }
}


以上是对于返回自身的Func&lt;T&gt;来说,正确的“T”是什么?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>