如何在switch语句中使用字符串资源

问题描述

是否可以在switch语句中使用字符串资源?尝试以编程方式获取字符串资源后,将返回错误

错误

'resourceLoader'是变量,但像类型一样使用

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,string language)
    {
        throw new NotImplementedException();
    }
}

解决方法

您要寻找pattern matching吗?这只是我最近发现的东西(它是C#7功能which I came across in this link),您所做的与我的用例有些不同,但是我只是使用伪代码进行了快速测试(调用另一个类的方法,该方法从switch语句中获取并返回一个字符串,该字符串似乎有效。对于您正在做的事情,我认为您会有这样的事情:

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;
,

我认为您需要退后一步,看看为什么您想要一个switch语句:可能有一个可读的代码块。您可以通过几个if()轻松地执行相同操作:

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;

现在您可以使用pattern when clauses重写它,以将它塞入开关中,但是我认为这不是合适的结构,因为它并没有真正提高可读性。您可以选择带有选项的词典:

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

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

您甚至可以通过初始化一次此字典来缓存资源查找,例如在包含类的构造函数中。