5

我有一个问题,我希望将函数调用添加到委托,但是这些函数调用中的每一个都将具有唯一的参数。我无法弄清楚或在其他地方找到解决方案,所以我转向你们:)

下面的一些伪..

(所以基本上,我正在创建一个委托和一个事件,并且 AddToDelegate 函数应该将函数调用添加到事件(具有唯一值),然后 GetData 函数在一个字符串中返回所有响应 -问题出在作为行的 AddToDelegate 函数a += new A(SomeFunc)(i.ToString());实际上应该只是 a+= 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 表达式闭包来做到这一点。

下面的示例将创建添加委托到 a ,该委托将在循环时使用 i 的值调用 SomeFunc。需要该变量capture来确保捕获正确的值 - 请参阅如何告诉 lambda 函数捕获副本而不是 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 回答