[英]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.