5

関数呼び出しをデリゲートに追加したいという問題がありますが、これらの関数呼び出しにはそれぞれ固有のパラメーターがあります。私はそれを理解することも、他の場所で解決策を見つけることもできないので、皆さんに頼っています:)

以下のいくつかの疑似..

(したがって、基本的に、私はデリゲートとイベントを作成しており、AddToDelegate 関数は関数呼び出しをイベントに (一意の値で) 追加することになっています。GetData 関数はすべての応答を 1 つの文字列で返します。問題はAddToDelegate 関数として、行a += new A(SomeFunc)(i.ToString());+= new A(SomeFunc);は実際には) のみである必要があります

デリゲートでこれを行う方法はありますか?または間違ったツリーを吠えていますか?

public delegate string A(string s);
public event A a;

public void AddToDelegate()
{
    for (int i = 0; i < DelegateList.Length; i++)
    {
        a += new A(SomeFunc)(i.ToString());
    }
}

public string GetData()
{
    StringBuilder _sb = new StringBuilder();
    if (a != null)
    {
        Delegate[] DelegateList = a.GetInvocationList();
        for (int i = 0; i < DelegateList.Length; i++)
        {
            _sb.Append(((A)DelegateList[i]));
        }
    }
    return _sb.ToString();
}
4

2 に答える 2

3

本当に必要なものはわかりませんが、この追加の変数をスコープ内に保持する無名関数を使用できます。

a += new A( s => { 
    string extra_value = i.ToString();
    return SomeFunc(s, extra_value);
  });

これは次のように簡略化できます。

a += s => SomeFunc(s, i.ToString());
于 2012-07-12T13:35:01.487 に答える
0

はい、 labda式クロージャを介してこれを行うことができます。

以下の例では、ループ時に値iを使用してSomeFuncを呼び出す追加デリゲートを作成します。変数captureは正しい値がキャプチャされるようにするために必要です-ラムダ関数にC#の参照の代わりにコピーをキャプチャするように指示する方法を参照してください。

public event Action<string> a;

public void AddToDelegate()
{
    for (int i = 0; i < DelegateList.Length; i++)
    {
        int capture = i;
        a += () => SomeFunc(capture.ToString());
    }
}

public string GetData()
{
    StringBuilder _sb = new StringBuilder();
    if (a != null)
    {
        Delegate[] DelegateList = a.GetInvocationList();
        for (int i = 0; i < DelegateList.Length; i++)
        {
            _sb.Append((Action<string>)DelegateList[i]());
        }
    }
    return _sb.ToString();
}
于 2012-07-12T13:47:51.840 に答える