如何组合和简化以下功能?

时间:2017-09-12 15:07:20

标签: c#

我有许多功能大致相似的实现:

private async void buttonSetQmBrakeDelay_Click(object sender, EventArgs e)
{
    var cells = objectListView.CheckedObjects.Cast<QMDevice>().ToList();
    if (cells == null)
        return;

    await Task.WhenAll(cells.Select(async c =>
    {
        bool b = await c.SetBrakeDelay((uint)numericUpDownQmBrakeDelay.Value);
        ...
    }));
}

private async void buttonPsMoveTo_Click(object sender, EventArgs e)
{
    var cells = objectListView.CheckedObjects.Cast<PSDevice>().ToList();
    if (cells == null)
        return;

    await Task.WhenAll(cells.Select(async c =>
    {
        bool b = await c.MoveTo((float)numericUpDownPsTargetPos.Value, (float)numericUpDownPsSpeedOverride.Value);
        ...
    }));
}

唯一的区别是匿名函数的Cast类型和正文。如何创建单个方法,我传递类型和匿名函数?

我期待这样的事情:

private async void buttonPsMoveTo_Click(object sender, EventArgs e)
{
    await CheckAndRunCommandAsync(PSDevice, {
        bool b = await c.SetBrakeDelay((uint)numericUpDownQmBrakeDelay.Value);
    ...
    });
}

1 个答案:

答案 0 :(得分:0)

您描述的方法可以这样写:

private async Task CastAndApplyCheckedObjects<T>(Func<T, Task> command)
{
    await Task.WhenAll(objectListView.CheckedObjects.Cast<T>().Select(command));
}

然后你可以这样称呼它:

private async void buttonPsMoveTo_Click(object sender, EventArgs e)
{
    await CastAndApplyCheckedObjects<PSDevice>(async c => {
        bool b = await c.SetBrakeDelay((uint)numericUpDownQmBrakeDelay.Value);
    ...
    });
}

正如人们在评论中提到的那样,我并没有真正看到使用Cast的重点。如果您已经保证所有项目都是您想要的类型,那么为什么CheckedObjects不是该类型的集合?如果你没有这种保证,你可能应该使用OfType,否则演员可能会抛出异常。