【问题标题】:Pass parameter to delegate c#将参数传递给委托c#
【发布时间】:2012-07-12 05:55:56
【问题描述】:

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

下面有些伪..

(所以基本上,我正在创建一个委托和一个事件,并且 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();
}

【问题讨论】:

  • 你想要完成什么?
  • 上面的伪代码会生成一个字符串,详细说明所有唯一值
  • 该问题询问您要完成的工作,而不是上述伪代码未能完成的工作。您可能确实找错了树,但我们无法知道,除非您告诉我们什么您想做什么,而不是如何您无法做到。您的输入和预期输出是什么?给出一个使用示例,而不是一个实现示例。

标签: c# delegates


【解决方案1】:

不确定您真正想要什么,但您可以使用匿名函数将这个额外变量保存在其范围内:

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

可以简化为:

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

【讨论】:

    【解决方案2】:

    是的,您可以通过labda expressionsclosures 进行此操作。

    下面的示例将创建添加委托到 a ,该委托将在循环时使用 i 的值调用 SomeFunc。需要变量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();
    }
    

    【讨论】:

    • 仍然需要修复 sb.Append() 的混乱通道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2011-05-29
    • 2016-09-03
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多