簡體   English   中英

如何管理使用任意調用 arguments 注冊的方法列表作為委托,通過另一個調用方法調用它們?

[英]How to manage a list of methods registered with arbitrary call arguments count as delegates, to call them via another invocation method?

我想將回調及其參數列表(具有任意數量的參數)傳遞給 register 方法,以便稍后調用它。 代碼如下:

public delegate void MyDelegate(params object[] args);
public void Register(MyDelegate callback, params object[] args);
public void InvokeOnNeed(); // Invoke stored callback with stored args

別的地方:

private void foo(string foostring) {
    ...
}
Register(foo, "foo")
private void bar(int barint) {
    ...
}
Register(bar, 123)

我怎樣才能做到這一點?

我們可以使用代表和參數的字典來實現:

using System.Collections.Generic;

Dictionary<Delegate, object[]> Callbacks = new Dictionary<Delegate, object[]>();

因此注冊方法如下:

void Register(Delegate callback, params object[] args)
{
  if ( !Callbacks.ContainsKey(callback) )
    Callbacks.Add(callback, args);
}

為了允許多次使用同一個委托,我們需要使用Dictionary<Delegate, List<object[]>>

但是要保證按注冊順序調用,就需要另外一個表模式。

和調用者:

public void InvokeOnNeed()
{
  foreach ( var item in Callbacks )
    item.Key.DynamicInvoke(item.Value);
}

測試

我使用了procedure和function來顯示這里我們丟失了返回的結果:

void Method1(string str)
{
  Console.WriteLine(str);
}

int Method2(int a, int b)
{
  Console.WriteLine(a + b);
  return a + b;
}
Register((Action<string>)Method1, "test");
Register((Func<int, int, int>)Method2, 10, 20);
InvokeOnNeed();

演員需要編譯代碼。

當然,我們可以為方法聲明一個委托並強制轉換為這種類型,而不是使用 Action 和 Func,但這很奇怪和骯臟:

delegate void MyDelegate(params object[] args);

static void Method1(params object[] args) { }
static void Method2(params object[] args) { }

Register((MyDelegate)Method1, "test");
Register((MyDelegate)Method2, 10, 20);

實際上,要使用它,簽名的參數部分和返回的類型必須完全相同。 因此,只有當所有方法都需要參數 args 為 object 或任何相同類型時,它才會有用。

Output

Test
30

獲取方法的結果

public IEnumerable<object> InvokeOnNeed()
{
    foreach ( var item in Callbacks )
      yield return item.Key.DynamicInvoke(item.Value);
}
var results = InvokeOnNeed();
int index = 1;
foreach (var item in results)
  Console.WriteLine($"Result #{index++}: {item?.ToString() ?? "null"}");
Result #1: null
Result #2: 30

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM