20 votes

Existe-t-il un modèle C# pour les membres de classe fortement typés avec des méthodes set/get externes ?

J'ai la structure suivante et j'aimerais trouver une solution qui permette de bénéficier des deux classes suivantes. La première classe utilise des chaînes et des membres fortement typés :

public class UserSessionData
{
    private string Get(string key)
    {
        throw new NotImplementedException("TODO: Get from external source");
    }
    private void Set(string key, string value)
    {
        throw new NotImplementedException("TODO: Set in external source");
    }

    public string CustomerNumber {
        get { return Get("CustomerNumber"); }
        set { Set("CustomerNumber", value); }
    }
    public string FirstName {
        get { return Get("FirstName"); }
        set { Set("FirstName", value); }
    }
    public string LastName {
        get { return Get("LastName"); }
        set { Set("LastName", value); }
    }

    // ... a couple of hundreds of these
}

Je peux imaginer une alternative qui serait une Get y Set avec une méthode enum paramètre. Voici la deuxième classe :

public class UserSessionData
{
    public enum What {
        CustomerNumber, FirstName, LastName, // ...
    }

    public string Get (What what) { return MyExternalSource(what); }
    public string Set (What what, string value) { return MyExternalSource(what); }
}

Mais le côté consommateur de la classe 2 n'est pas beau à voir :
UserSessionData.Get(UserSessionData.What.CustomerNumber)
Comparez-la à la première classe : UserSessionData.CustomerNumber

Existe-t-il un moyen fortement typé d'appeler les méthodes Get et Set dans mon exemple de première classe ? En d'autres termes : Comment puis-je bénéficier des avantages des deux classes, à savoir la maintenabilité des membres fortement typés et une syntaxe attrayante ?

0voto

astef Points 1199

Je ne sais pas pourquoi une solution aussi simple n'a pas encore été proposée :

public class UserSessionData
{
    private string Get(What what)
    {
        throw new NotImplementedException("TODO: Get from external source");
    }
    private void Set(What what, string value)
    {
        throw new NotImplementedException("TODO: Set in external source");
    }

    public string CustomerNumber {
        get { return Get(What.CustomerNumber); }
        set { Set(What.CustomerNumber, value); }
    }

    // ... 
}

public enum What
{
    CustomerNumber, FirstName, LastName, // ...
}

Et l'usage que vous en avez fait : userSessionData.CustomerNumber

Si votre "source externe" préfère les chaînes de caractères, vous pouvez faire en sorte que What enum private et cast enum to string.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X