0

C# 中是否有我可以用于调用的标准委托。我是否必须为我必须调用的每个新函数签名声明一个新委托?

现在我只有那些签名。但是,如果我可以使用本机委托来处理任何复杂的返回和参数,那就太好了。

public bool isDone()
{...}
public void doStuff()
{...}
public void doMoreStuff(object o)
{...}
public void doEvenMoreStuff(string str)
{...}

// I'm declaring my "custom" delegates like this:
private delegate bool delegate_bool();
private delegate void delegate_void(string line);

// and calling via
if (InvokeRequired)
    Invoke(new delegate_void(doStuff), new object[] { });
else
    {...}


编辑:答案似乎是Action<>Func<>

if (InvokeRequired)
    return Invoke(new Func<bool>(isDone), new object[] { });
else
    {...}
if (InvokeRequired)
    BeginInvoke(new Action(doStuff), new object[] { });
else
    {...}
if (InvokeRequired)
    BeginInvoke(new Action<string>(doEvenMoreStuff), new object[] { "hello world" });
else
    {...}
4

6 回答 6

5

您正在寻找Action<*>Func<*>代表,它们正是这样做的。

于 2013-03-12T16:29:08.213 回答
4

Action<>Func<>代表是您应该尽可能使用的“标准”代表。在极少数情况下不能使用它们。

特别是如果您有可选参数refout参数,超过 16 个参数,或者有一个params参数,那么您将需要使用另一个(或您自己的自定义)委托。

于 2013-03-12T16:29:41.390 回答
2

Action<>Func<>代表将为您提供所需的

于 2013-03-12T16:29:22.067 回答
2

Action<>Func<>可以执行这些类型的任务。

于 2013-03-12T16:29:33.277 回答
2

是的,您可以使用Action和 lambda。例如, Dispatcher.Invoke 需要一个委托,但我们可以将 lambda 转换为 Action,因此不需要为其定义新的委托:

Dispatcher.Invoke((Action)delegate() { ... });
于 2013-03-12T16:29:39.810 回答
1

正如所有人所说。Action 和 Func 会做你想做的事。Action 应该用于不返回值的方法,如果需要返回值,您可以使用 Func。

于 2013-03-12T16:30:55.283 回答