我正在使用工廠來隱藏我想傳遞一個已知長度數組的構造函數。我想使工廠方法足夠普遍,它將處理來自包含任意數量參數(太少,太多,或者只是正確數字)的客戶端的輸入。C#從params參數複製到特定長度的數組
有沒有一種方法,使用更多的慣用C#來限制傳遞給工廠方法的參數參數,所以我可以肯定它有我的創建對象的正確長度?
using System.Linq;
public class GridFactory
{
public IGrid Create2DGrid(params bool[] inputWrappingRules)
{
// Yikes! This works, but it's kind of a monster:
var gridWrappingRules = new bool[2];
inputWrappingRules.Take(2).ToArray().CopyTo(gridWrappingRules, 0);
// These are susceptible to errors:
// var gridWrappingRules = new bool[2];
// System.Array.Copy(inputWrappingRules, gridWrappingRules, 2);
// --or--
// var gridWrappingRules = new System.ArraySegment<bool>(inputWrappingRules, 0, 2).Array;
return new TwoDGrid(gridWrappingRules);
}
}
public class TwoDGrid : IGrid
{
private bool[] _wraps;
internal TwoDGrid(bool[] wraps)
{
_wraps = wraps;
}
// I want to use _wraps[0] and _wraps[1] in my methods here...
}
public class Program
{
public static void Main(string[] args)
{
var gridFactory = new GridFactory();
var grid1 = gridFactory.Create2DGrid();
var grid2 = gridFactory.Create2DGrid(true);
var grid3 = gridFactory.Create2DGrid(false, true);
var grid4 = gridFactory.Create2DGrid(false, true, true);
/*
*So, then,
* grid[1]._wraps is { false, false },
* grid[2]._wraps is { true, false },
* grid[3]._wraps is { false, true }, and
* grid[4]._wraps is { false, true }.
*/
}
}
不在編譯時,除非'CodeContracts'可以驗證長度。在運行時您可以在構造函數(或工廠)中進行檢查,如果不期望數組中的項數,則會拋出一個'ArgumentOutOfRangeException'。 – Igor
我不明白爲什麼你應該允許客戶通過更少或更多的參數,而不是你已經知道「正確」的尺寸。 – HimBromBeere