问题描述
是否可以在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;
您甚至可以通过初始化一次此字典来缓存资源查找,例如在包含类的构造函数中。