我有一个问题,我希望将函数调用添加到委托,但这些函数调用中的每一个都将具有唯一的参数。我无法弄清楚或在其他地方找到解决方案所以我转向你们:)
下面有些伪..
(所以基本上,我正在创建一个委托和一个事件,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();
}
答案 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 expressions和closures完成此操作。
下面的示例将创建一个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();
}