2

我正在構建一個庫,其中包含一系列方法,其中每個方法都有幾個重載,我試圖簡化它們。C# - 使用lambda指定非默認參數

許多方法都有循環過載選項。例如

AddString(string option1) 
AddString(string option1, int option2) 
AddString(string option1, int option2, bool option3) 

AddArray(string option1) 
AddArray(string option1, int option2) 
AddArray(string option1, int option2, bool option3) 

現在,我知道我可以指定那些作爲默認參數 - 具有指定默認值的參數。我不想這樣做,因爲我希望默認設置可以從項目配置到項目,甚至從調用者到調用者。

我也意識到,我可以建立一個Options對象,它具有(配置)默認值,用戶可以通過這方面的一個實例到另一個超載,像這樣

var options = new Options(); 
options.OptionProperty1 = "A new string"; 
AddString(options); 

但我寧願是有含有默認爲所有參數靜態Options對象,莫名其妙只指定在一個內嵌調用的變化,像這樣

AddString(options => options.Set(
          OptionProperty1 = "A string", 
          OptionProperty2 = 1, 
          OptionProperty3 = true 
         )); 

這是可能的,並如果是的話那麼方法簽名會是什麼樣子?

回答

3

爲了有一個Set方法就像你後,就必須有你想設置的每個選項,這將可能得到的時間之後笨重的參數,

你可以選擇一個流暢的界面這應該讓你想要你想要的。例如:

class Options 
{ 
    Options Option1(string value) 
    { 
    m_Option1 = value; 
    return this; 
    } 

    Options Option2(int value) 
    { 
    m_Option2 = value; 
    return this; 
    } 
} 

現在AddString應該是這樣的:

AddString(options = > options.Option1("A String").Option2(1))); 

AddString實施應該是這樣的:

public void AddString(Action<Options> optionConfig) 
{ 
    var options = new Options(); 
    optionConfig(options); 

    // rest of method 
} 

或者你可以有來電創建Options實例。這將使他們能夠直接設置屬性:

class Options 
{ 
    public string Option1{get;set;} 
    public int Option2{get;set;} 
} 

現在調用者可以說:

AddString(() = > new Options{Option1="A String", Option2=1}); 

AddString看起來是這樣的:

public AddString(Func<Options> optionsCreator) 
{ 
    Options options = optionsCreator(); 

    // rest of method 
} 
+0

我非常喜歡你的建議 - 但AddString方法簽名會是什麼樣子? – awj

+0

@awj - 我已經添加了一個例子 – Sean

+1

我也喜歡這種方法。如果你看看devexpress工具,他們採取的方法與此非常相似,並且工作得很好。 – Luke101