2 votes

Comment utiliser une ressource de type chaîne dans une instruction switch

Existe-t-il un moyen d'utiliser une ressource de type chaîne avec une instruction switch ? Après avoir essayé d'obtenir une ressource de type chaîne par voie programmatique, une erreur est renvoyée.

Erreur

'resourceLoader' est une variable mais est utilisé comme un type.

C#

public class PageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();

        Type page = null;
        switch (value as string)
        {
            case resourceLoader.GetString("SteveJohnson/Text"):
                page = typeof(FirstPage);
                break;
            case resourceLoader.GetString("PeteDavidson/Text"):
                page = typeof(SecondPage);
                break;
            case resourceLoader.GetString("OneDrive/Text"):
                page = typeof(FistPage);
                break;
            case resourceLoader.GetString("Twitter/Text"):
                page = typeof(SecondPage);
                break;
            default:
                break;
        }

        return page;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

2voto

d219 Points 1172

Vous êtes à la recherche de filtrage par motif ? Je l'ai découvert récemment (c'est une fonctionnalité de C# 7). que j'ai trouvé dans ce lien ) et ce que vous faites est un peu différent du cas d'utilisation que j'avais, mais je viens de faire un test rapide avec du pseudo-code (appel d'une méthode d'une autre classe qui prend et renvoie une chaîne de caractères de la classe switch ), ce qui semble fonctionner. Pour ce que vous faites, je pense que vous auriez quelque chose comme ça :

switch (value)
{
    case string _ when (resourceLoader.GetString("SteveJohnson/Text") == value as string):
                    page = typeof(FistPage);
                    break;
    case string _ when (resourceLoader.GetString("PeteDavidson/Text") == value as string):
                    page = typeof(SecondPage);
                    break;

1voto

CodeCaster Points 38181

Je pense que vous devez prendre un peu de recul et regarder pourquoi vous voulez une instruction switch : probablement pour avoir un bloc de code lisible. Vous pourriez facilement faire la même chose avec un couple d'instructions if() s :

var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();

Type page = null;
if (value == resourceLoader.GetString("SteveJohnson/Text"))
    page = typeof(FirstPage);
else if (value == resourceLoader.GetString("PeteDavidson/Text"))
    page = typeof(SecondPage);
else if (value == resourceLoader.GetString("OneDrive/Text"))
    page = typeof(FistPage);
else if (value == resourceLoader.GetString("Twitter/Text"))
    page = typeof(SecondPage);      

return page;

Vous pouvez maintenant réécrire ceci en utilisant motif when clauses pour l'insérer dans un interrupteur, mais je ne pense pas que ce soit la construction appropriée ici, car cela n'améliore pas vraiment la lisibilité. Vous pourriez opter pour un dictionnaire avec des options à la place :

var pageTypes = new Dictionary<string, Type>
{
    { resourceLoader.GetString("SteveJohnson/Text"), typeof(FirstPage) },
    { resourceLoader.GetString("PeteDavidson/Text"), typeof(SecondPage) },
    { resourceLoader.GetString("OneDrive/Text"), typeof(FirstPage) },
    { resourceLoader.GetString("Twitter/Text"), typeof(SecondPage) },
};

// Defaults to `null` when not mached
pageTypes.TryGetValue((string)value, out Type page);
return page;

Vous pouvez même mettre en cache les recherches de ressources en initialisant ce dictionnaire une seule fois, par exemple dans le constructeur de la classe contenante.

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