我有许多功能大致相似的实现:
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);
...
});
}
答案 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
,否则演员可能会抛出异常。