传递参数以委托c#

时间:2012-07-12 13:10:28

标签: c# delegates

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

下面有些伪..

(所以基本上,我正在创建一个委托和一个事件,AddToDelegate函数应该添加对事件的函数调用(具有唯一值),然后GetData函数返回一个字符串中的所有响应 - 问题出现在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();
}

2 个答案:

答案 0 :(得分:1)

不确定你真正想要的是什么,但是你可以使用一个匿名函数来保存这个额外的变量:

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

可以简化为:

a += s => SomeFunc(s, i.ToString());

答案 1 :(得分:0)

是的,您可以通过labda expressionsclosures完成此操作。

下面的示例将创建一个add委托给一个在循环时调用SomeFunc,其值为i。需要变量capture以确保捕获正确的值 - 请参阅How to tell a lambda function to capture a copy instead of a reference in 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();
}