【问题标题】:anonymous delegate with return value带返回值的匿名委托
【发布时间】:2014-01-02 06:52:34
【问题描述】:

[实际上,我不确定问题是否与anonymous和delgate有关。]

在我的应用程序中,我使用异步创建新项目。在 AddNew 方法中,它将调用从 repo 类中创建一个新项目,然后将其添加到列表项目中。 create 方法有参数,但有返回值。

问题是我真的不知道如何用匿名调用创建方法。

代码如下。

    protected void AddNew()
    {
        _repo.Create(() => AddToListItem(x)) // I want the value (x) that return from repository.Create to use with AddToListItem(x)
    }

    public P Create(Action completed = null)
    {
        var p = new P();
        Insert(p);
        return p;
    }

    public void Insert(P p, Action completed = null)
    {
        _service.Insert(p,
            () =>
            {
                if (onCompleted != null)
                {
                    onCompleted();
                }
            }
            );
    }

【问题讨论】:

  • 以上代码不是异步的。此外,尚不清楚您要做什么。请详细说明。

标签: c# asynchronous callback delegates anonymous


【解决方案1】:

代替无参数Action 使用通用Action<T>

封装一个只有一个参数并且不返回值的方法。

您的代码应如下所示:

public P Create(Action<P> completed = null)
{
    var p = new P();
    Insert(p, completed);
    return p;
}

public void Insert(P p, Action<P> completed = null)
{
    _service.Insert(p,
        () =>
        {
            if (completed != null)
            {
                completed(p);
            }
        }
        );
}

您还必须更改 lambda 表达式以匹配 Action&lt;P&gt;

protected void AddNew()
{
    _repo.Create((x) => AddToListItem(x))
}

【讨论】:

  • 那么在最后一个方法中你甚至可以去掉 lambda,因为参数列表只是原封不动地传递给一个方法,所以你可以说 _repo.Create(AddToListItem); 如果你愿意。
  • @JeppeStigNielsen 是的,你是对的!我总是忘记这一点,因为我个人觉得这种方式的可读性不如x =&gt; Method(x)
  • 为什么不那么可靠?它甚至删除了一个额外的方法调用:为您的 lambda 生成的方法。
  • @riezebosch 你误读了我的评论。我认为它的可读性不那么可靠,而不是不那么可靠。