2014-06-13 1 views
2

바라건대 올바른 용어가 있습니다. CSharp 대리자가 알 수없는 인수가 0 개 이상인 알 수없는 함수를 가져 오려고합니다. 모든 것을 저장합니다. 나중에 저장 한 시점의 인수를 사용하여 저장된 메서드를 호출합니다.알 수없는 매개 변수가 여러 개있는 알려지지 않은 메서드의 대리자 저장 및 호출?

많은 스레드와 메시지를 확인했지만 아직 확실한 답을 찾지 못했습니다. 여러 곳에서 성공적인 해결 방법을 찾았지만 유용성에는 '꽤'코드를위한 "통사론 적 설탕"이 필요합니다.

도움이 될 것입니다!

은 ... 다음 코드는 작동 :

InvokeManager.Eval (1 층, 새로운 System.Action (MyDelayedMethod), 새로운 객체 [] { "일부 인수 데이터", 3412, 사실을});

... 이것은 구문 목표입니다. 수행 할 수 있습니까? 얼마나 가까워 질 수 있습니까? :

InvokeManager.Eval (1f, Log ("some argument data", 3412, true)));

... 전문 코드 : 호출자 (당신이 결과를 계산해야하는 경우 또는 Func<T>)

public class InvokeContainer : IComparable<InvokeContainer> 
    { 
      int _activationStamp; 
      Delegate _delayedFun; 
      object[] _args; 

      public int ActivationTimestamp { 
        get { return _activationStamp; } 
      } 

      public Delegate Callback { 
        get { return _delayedFun; } 
      } 

      public object[] Args { 
        get { return _args; } 
      } 

      public InvokeContainer(float delay, NcTickTimerTool timer, Delegate method, object[] args) 
      { 
        _args = args; 
        _delayedFun = method; 
        _activationStamp = (int)(1000f * delay) + timer.GetElapsedTickCount(); 
      } 

      ... 

    } 

    public class InvokeManager 
    { 
      private BinaryHeap<InvokeContainer> _heap; 
    ... 

      public static void Eval(float delay, Delegate method, params object[] args) 
      { 
        _instance._heap.Add(new InvokeContainer(delay, _instance._ticker, method, args)); 
      } 

      // Gets called externally on a thread 

      void Update() 
      { 
        InvokeContainer poppedCallback; 
        int currentTicks = _ticker.GetStartedTickCount(); 
        int heapPeekTicks = 0; 

        if(_heap.Count>0) 
        heapPeekTicks = ((InvokeContainer)_heap.Peek()).ActivationTimestamp; 

        // Invoke all methods which have waited long enough 

        while (_heap.Count>0 && heapPeekTicks<=currentTicks) 
        { 
          poppedCallback = (InvokeContainer)_heap.Remove(); 
          poppedCallback.Callback.DynamicInvoke(poppedCallback.Args); 
          poppedCallback = (InvokeContainer)_heap.Peek(); 
          if (poppedCallback!=null) 
            heapPeekTicks = poppedCallback.ActivationTimestamp; 
          else 
            break; 
        } 
      } 

    ... 

    } 

답변

3

오히려 매개 변수의 알 수없는 번호로 대리자를 받아들이는 것보다, 그냥 Action을 받아 람다를 사용하여 대리인에서 사용해야 할 수도있는 모든 값을 닫을 수 있습니다.

호출자와 구현 모두에서 훨씬 쉽게 작업 할 수있을뿐 아니라 정적 입력을 보장하고 사용자가 제공하는 값에서 다른 수의 매개 변수 나 다른 유형의 매개 변수를 허용하는 대리인을 제공 할 수 없습니다 그것으로.

관련 문제