当涉及到关键字和其他(对于域)众所周知的字符串值时,我更喜欢使用某种解析。在您的特定情况下,我可能会定义一个枚举
public enum Keywords {
SettleLG,
SettHjort,
SkutteLG,
SkuttHjort,
RundBall
}
然后你可以解析关键词
//Note this will (deliberately) throw an exception
//if the string does not match a defined value
//depending on your needs you might want to handle that
var parsedKeyword = (Keywords)Enum.Parse(typeof(Keywords),keyword,true);
有了它,您就可以编写一个开关
private string GetRelativUrlFromKeyword(Keywords parsedKeyword){
switch(parsedKeyword)
case Keywords.SetteLG:
case Keywords.SettHjort:
return "../SMSFunction/SeenSMS.ascx";
case Keywords.SkutteLG:
case Keywords.SkuttHjort:
return "../SMSFunction/ShotSMS.ascx";
case KeyWords.RundBall:
return "../SMSFunction/RoundballSMS.ascx";
default:
throw new InvalidOperationException("Keyword not recognized" + parsedKeyword);
}
把它们放在一起你的调用代码看起来像这样
var parsedKeyword = (Keywords)Enum.Parse(typeof(Keywords),keyword);
var relativeUrl = GetRelativUrlFromKeyword(parsedKeyword);
Response.Redirect(relativeUrl,true);
通过将值解析为枚举,您还可以验证值 (1),这将更容易找到与传递不正确值的代码的其他部分相关的错误。如果您希望在一组值和另一组值之间有一个硬编码映射,例如关键字和相对 URL 之间的情况,切换构造可以正常工作。
我将映射拆分为一个单独的函数,因为它使代码更容易推理每个函数/方法何时执行一件事。开关中的默认情况会抛出异常。这是为了在您添加新关键字但忘记在 switch 中处理它时捕获。您可以选择其他默认值。我通常喜欢在默认情况下抛出异常,这很可能是因为我在更改代码的其他部分时忘记了做某事。(2)。我还在你的 response.redirect 中添加了一个 bool (true),它告诉框架你已经完成了响应,因此它可以将它发送给客户端(这是次要的,但我更喜欢让我的代码像可能,当涉及到代码的意图时。)
(1)如果你不能得到任何关键字字符串,请告诉我,我可以展示你将如何使用 TryParse (2)如果我遗漏了一个可能的案例值,我实际上希望有一个编译器警告,如果我得到在 F# 中有一个不完整的模式匹配,但这对于开关来说不一定是可能的(例如,当使用字符串时它不是)