바라건대 올바른 용어가 있습니다. 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;
}
}
...
}