2016-12-07 37 views
1

我想重構在C#中切換case語句。 我已經使用了下面的代碼,它運行良好。但現在我必須改變代碼。一種方法有不同的簽名[它沒有參數],而其他方法只有一個參數。 有人可以幫我修改不同簽名方法的代碼嗎?使用Func而不是開關在C#中籤名不同的方法

Dictionary<string, Func<SqlDataReader, object>> methods = new Dictionary<string, Func<SqlDataReader, object>>(); 
methods = LoadMethodNames(); 
return methods[key].Invoke(reader); // key = A or B 

private Dictionary<string, Func<SqlDataReader, object>> LoadMethodNames() 
{ 
    Dictionary<string, Func<SqlDataReader, object>> s= new Dictionary<string, Func<SqlDataReader, object>>(); 
    s.Add("A", A); 
    s.Add("B", B); return s; } 


private object A(SqlDataReader reader) 
{ 
    return new object; 
} 

private object B(SqlDataReader reader) 
{ 
    return new object; 
} 

現在的變化是方法B

private object B() { return new object; } 
+0

你不能將不同類型的'Func'放到一個集合中,因爲它們沒有任何*共同點。因此'Func '與'Func '完全無關。但是,爲什麼不簡單地將參數保留在「B」內,而不是使用它?或者從'A' *和*'B'中省略它? – HimBromBeere

+0

是的,我試過這樣做。但SonarQube不允許我。它顯示爲一個主要問題:P 另外,如果將來我必須添加/刪除參數,它將會很有用。 – IamP

+0

您不能修改方法簽名而不更改字典的聲明。但是,'Func '和'Func '不兼容。 – HimBromBeere

回答

0

你可以用額外的間接水平實現這一點;

s.Add("B", reader => B()); 

您可以添加,如有必要,安全網,確保在讀者,傳遞的是null

s.Add("B", reader => { Debug.Assert(reader == null); return B(); }); 

簡單地將被忽略的參數包不帶參數調用一個請記住,這簡直就是黑客。如果您期待頻繁的簽名變化,那麼您將不得不重新考慮您的策略,因爲當前的解決方案不會削減它;沒有可以代表具有不同簽名的代表的共同Func

+0

感謝您的解決方案。截至目前,它的工作。我想我需要爲未來的變化尋找鏈式責任/多態。 – IamP

相關問題