假设此方法在名为IWithManagedCreate
的接口上使用扩展方法,则您具有以下方法:
public static IWithManagedCreate WithExistingDataDisk(this IWithManagedCreate vm,IDisk disk)
{
// ...
return vm;
}
您可以简单地添加一个自己的扩展方法,并带有一个params IDisk[]
重载:
public static IWithManagedCreate WithExistingDataDisks(this IWithManagedCreate vm,params IDisk[] disks)
{
foreach (var disk in disks)
{
vm = vm.WithExistingDataDisk(disk);
}
return vm;
}
并这样称呼它:
.WithTags(tags)
.WithExistingDataDisks(d) // passing the array containing 0 or more disks
.CreateAsync();
因此,要回答这个问题,不,流畅的语法没什么特别的,只是一连串的方法调用。当您链接方法调用时(通过让每个方法返回可以调用更多方法的东西),您不能将它们设置为有条件的。您可以制作一个方法,但是如上所述却什么也不做。当您使用空数组调用它时,什么也没发生。
,
WithExistingDataDisk
在IWithManagedDataDisk
接口中声明。
此接口不提供任何在一个调用中添加许多现有IDisk
的方法。
无论如何,您可以将其实现为扩展方法,如下所示:
public static class WithManagedDataDiskExtensions
{
// allow to manually specify many disks to add
public static IWithManagedDataDisk WithExistingDataDisks(this IWithManagedDataDisk self,params IDisk[] disks)
{
return self.WithExistingDataDisks((IEnumerable<IDisk>) disks);
}
// allow to add an enumerable of many disks
public static IWithManagedDataDisk WithExistingDataDisks(this IWithManagedDataDisk self,IEnumerable<IDisk> disks)
{
foreach (var disk in disks)
self = self.WithExistingDataDisk(disk);
return self;
}
}
并像这样使用它:
var tempVM = await azure.VirtualMachines.Define(targetVMName)
.WithRegion(vm.Region)
.WithExistingResourceGroup(targetResourceGroupName)
.WithNewPrimaryNetworkInterface(nicDefinitions[0])
.WithSpecializedOSDisk(disks[0],disks[0].OSType.Value)
.WithSize(vm.Size)
.WithTags(tags)
.WithExistingDataDisks(d[0],d[1],d[2],d[3])
//.WithExistingDataDisks(d)
.CreateAsync();
,
通常在流畅的API中,您可以在循环中使用分配,如下所示:
var expTempVM = azure.VirtualMachines.Define(targetVMName)
.WithRegion(vm.Region)
.WithExistingResourceGroup(targetResourceGroupName)
.WithNewPrimaryNetworkInterface(nicDefinitions[0])
.WithSpecializedOSDisk(disks[0],disks[0].OSType.Value)
.WithSize(vm.Size)
.WithTags(tags);
foreach (var d in disks)
{
expTempVM = expTempVM.WithExistingDataDisk(d);
}
var tempVM = await expTempVM.CreateAsync();
流利的API的基本设计是,每种方法都返回与其操作相同的类型。
如果可以的话,还可以定义自己的扩展方法.WithExistingDataDisks
或类似的方法。
本文链接:https://www.f2er.com/2838816.html