Assegnazione di variabili locali in modo globale

1

Ho cercato di rimuginare su una domanda che non so come risolvere e probabilmente ha una soluzione semplice, ma sto cercando di trovare una soluzione semplice.

Il seguente scenario è come tale. Diciamo che abbiamo le seguenti variabili.

string username;
string password;
string domain;
string location;

e voglio eseguire la stessa funzione su di essi

void AssignValueFromConfigFile() 
{
    username = ConfigurationManager.AppSettings["username"];
    if (username == null)
        throw new ValueNotFound("username");

    password = ConfigurationManager.AppSettings["password"];
}

..... ecc. per ognuno

Questo è ovviamente davvero noioso e il modo sbagliato per farlo. Possiamo farlo funzionare in un dizionario se avessimo:

var values = new Dictionary<string,string>() { {"username",""},{"password",""},{"domain",""},{"location",""}}

void AssignValueFromConfigFile()
{
    foreach(var val in values) 
    {
        val.Value = ConfigurationManager.AppSettings[val.Key];
        if (val.Value == null)
            throw new ValueNotFound(val.Value);
    }
}

Ma poi perdiamo la capacità di chiamare le variabili locali e dobbiamo sapere cosa sono nel dizionario. Come si ottiene questo?

    
posta Dan W 06.12.2016 - 11:22
fonte

2 risposte

4

Non c'è bisogno di un dizionario (a meno che tu non lo voglia, ovviamente). Puoi assegnare ciascuna variabile per riferimento, ad es.

void AssignValueFromConfigFile(string name, ref string value) {
    value = ConfigurationManager.AppSettings[name];
    if(value == null) {
        throw new ValueNotFound(name);
    }
}

    string username;
    string password;
    string domain;
    string location;
    AssignValueFromConfigFile("username", ref username);
    AssignValueFromConfigFile("password", ref password);
    AssignValueFromConfigFile("domain", ref domain);
    AssignValueFromConfigFile("location", ref location);

Tuttavia, una soluzione molto più ordinata sarebbe quella di applicare il schema di comando / separazione delle query , ad esempio

string GetValueFromConfigFile(string name) {
    var value = ConfigurationManager.AppSettings[name];
    if(value == null) {
        throw new ValueNotFound(name);
    }
    return value;
}

    var username = GetValueFromConfigFile("username");
    var password = GetValueFromConfigFile("password");
    var domain = GetValueFromConfigFile("domain");
    var location = GetValueFromConfigFile("location");

Hai una funzione che legge i dati e garantisce che non sia nulla. Il codice chiamante decide quindi cosa fare con i dati.

    
risposta data 06.12.2016 - 12:19
fonte
1

Potresti essere sfacciato di riflesso se vuoi farlo a tutte le proprietà di una classe, ad esempio:

public class LoginViewModel 
{
    string username;
    string password;
    string domain;
    string location;

    public void init()
    {
        var props = this.GetType().GetProperties();
        foreach(var prop in props) 
        {
            prop.SetValue(this, ConfigurationManager.AppSettings[prop.Name]);
            if (prop.GetValue(this) == null)
                throw new ValueNotFound(prop.Name);
        }
    }
}
    
risposta data 06.12.2016 - 22:27
fonte

Leggi altre domande sui tag