Troppe dichiarazioni If?

Ho una class che legge nel testo da un foglio di calcolo usando EPPlus. Funziona e fa esattamente ciò che voglio che faccia, ma sento che il modo in cui l’ho fatto è una ctriggers pratica, ma per la vita di me non riesco a trovare un’alternativa meno codificata e che usa meno istruzioni. la class contiene costanti come

private static string configUserName; private static string configPassword; private static string configUrl; private static string configDatabase; //etc 

Ce ne sono circa 40. La class esegue il loop di un foglio di calcolo leggendo tutti i valori per verificare quale valore è come:

 int i = 1; object isRow = currentWorksheet.Cells[i, 1].Value; while (isRow != null) { if (isRow.ToString().Trim().Equals("change_bank_details_policy")) { if (currentWorksheet.Cells[i, 2].Value != null) { change_bank_details_policy =c currentWorksheet.Cells[i,2].Value.ToString().Trim(); } } else if //etc 40 more if statements 

Quindi poiché i valori sono privati ​​ci sono 40 metodi come

 public static string GetConfigUserName() { return configUserName; } 

Ci deve essere un modo migliore per farlo? sembra il foglio di calcolo

 change_bank_details_policy,11459676 change_DD_date_policy,11441975 [40 more rows....] 

Puoi creare un dizionario (con Key String e valore Int ) che associa insieme la stringa e il valore?

Leggi il foglio di Excel una riga alla volta, per build il tuo dizionario.
Quindi utilizzare il dizionario per impostare le variabili appropriate.

Quindi il tuo dizionario avrà il seguente aspetto:

  KEY VALUE ============================|======== change_bank_details_policy |11459676 change_DD_date_policy |11441975 

e dopo che il dizionario è stato creato, puoi semplicemente fare:

 change_bank_details_policy = my_dictionary["change_bank_details_policy"]; 

Penso che la struttura assomiglierebbe a:

 Dictionary myDict = new Dictionary(); object isRow = currentWorksheet.Cells[i, 1].Value; while (isRow != null) { myDict.Add(isRow.ToString().Trim(), currentWorksheet.Cells[i,2].Value); // Go get the next Row.... details are up to you. } change_bank_details_policy = myDict["change_bank_details_policy"]; // Look up this key in the dictionary to get this integer.... change_DD_date_policy = myDict["change_DD_date_policy"]; // [... repeat 40 more times ... but no If statements ] 

La radice del problema è il fatto che hai ~ 40 variabili, questo è un odore di codice definito. Dovresti prendere in considerazione l’uso di un Dictionary , ad esempio per memorizzarli, piuttosto che un ampio uso di variabili.

Un Dictionary sta mappando da una “chiave” a un “valore”. Nel tuo caso, eseguirà il mapping da una stringa a una stringa (se effettivamente hai bisogno di una stringa per loro).

Le istruzioni switch sono già state menzionate, ma una caratteristica eccellente in C # è che è ansible impostare l’accesso diretto a una variabile come di sola lettura, quindi per rispondere alla seconda domanda le variabili potrebbero avere la seguente syntax:

 private static string configUserName { public get; private set; } 

Quale consentirebbe ai membri della class di accedere direttamente alla variabile, ma causerà un errore del compilatore se un utente prova a scrivere direttamente (ma non se tenta di leggerlo), quindi ad esempio:

 instance.configUserName = "Bob"; 

Funzionerà nel codice membro della class, ma non verrà compilato nel codice utente, mentre:

 String bob = instance.configUserName; 

Compilerà in entrambi i posti.

Il seguente codice non sovrascrive i valori non letti. Se una riga non è presente nel file di origine, i valori precedenti non vengono persi. Penso che sia un po ‘più a prova di proiettile sul contenuto del file sorgente.

 var dict = new Dictionary>(); dict.Add("change_bank_details_policy", v => change_bank_details_policy = v); // 40 of these, no choice int i = 1; object isRow = currentWorksheet.Cells[i, 1].Value; while (isRow != null) { string rowTitle = isRow.ToString().Trim(); if (dict.ContainsKey(rowTitle)) { // Or parse it or whatever you have to do to handle the cell value type long rowValue = currentWorksheet.Cells[i,2].Value; dict[rowtitle](rowValue); } isRow = currentWorksheet.Cells[++i, 1].Value; }