2012-07-12 252 views
2

我有一个问题,我希望将函数调用添加到委托,但每个函数调用都将具有唯一参数。所以我转向你们:)将参数传递给委托c#

以下一些伪我不能在其他地方弄明白或找到一个解决方案..

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

什么是你想实现什么? – 2012-07-12 13:36:32

+0

上面的伪代码会生成一个字符串,其中详细说明了所有的唯一值 – T1gg3rB0unC3 2012-07-12 13:58:42

+0

问题在于询问您要完成的是什么,而不是上述伪代码无法完成的事情。你可能确实在吠叫错误的树,但除非你告诉我们你想要做什么,而不知道它如何*你无法做到。你的投入是什么?你的预期产出是什么?给出一个用法示例,而不是一个实现示例。 – 2012-07-12 14:04:11

回答

1

不知道你真正想要的,但你可以使用匿名函数,将保留其范围内这一额外的变量:

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

这可以简化成这样:

a += s => SomeFunc(s, i.ToString()); 
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(); 
} 
+0

仍然需要修复sb.Append()的混乱通行证。 – 2012-07-12 14:06:21

+0

@HenkHolterman - 修正 - 感谢注意 – shf301 2012-07-12 14:21:53

+0

'()'仍然不起作用(一个A接受一个字符串参数)。 – 2012-07-12 14:26:21