当前位置: 首页 > 编程语言 > C#

重构长switch语句分享

时间:2023-04-10 16:55:12 C#

重构长switch语句我用c#编程,你通过口述命令来控制,所以现在我有一个很长的switch语句。Likeswitch(command){case"显示命令":ProgramCommans.ShowAllCommands();休息;案例“关闭窗口”:ControlCommands.CloseWindow();休息;case"切换窗口":ControlCommands.SwitchWindow();休息;}等几乎所有情况下只调用一个方法,方法不在一个类中,它们分布在许多类中。那么问题来了,如何将这种转换重构为更优雅的方式呢?您可以像这样重构switch语句:varcommands=newDictionary(){{"Showcommands",()=>ProgramCommans.ShowAllCommands()},{"Closewindow",()=>ControlCommands.CloseWindow()},{"切换窗口",()=>ControlCommands.SwitchWindow()},};if(commands.ContainsKey(command)){commands[command].Invoke();这种方法的主要优点是您可以在运行时更改“切换”。如果所有函数都获得相同的参数并返回相同的值,则可以使用Dictionary和委托将字符串映射到函数。此方法还允许您更改开关的运行时间-允许外部程序扩展程序的功能。如果函数不相同,您可以编写一个包装器-一个代理函数,它将接受所有其他函数的参数,并调用您想要的函数。这是您可以在这里执行的操作。您可以创建一个接口[ICommand],您可以在其中放置一个公共函数[例如:Execute]。然后您只需要用适当的类型启动该成员并调用Execute函数。这可能在未来包含更多的功能,所以它被扩展了。另外,您可以创建一个工厂方法,您可以在其中传递参数并获取相应的类以供使用。希望有所帮助。我意识到这是一篇旧文章,但在这些情况下,我发现属性和工厂非常方便。以下代码使用自定义属性(Command)来允许您对方法进行属性化并提供它们应如何响应您的字符串值。工厂方法使用反射来生成这些方法的字典,并在调用CommandFactory时调用它。事情可以稍微清理一下,调用invoke有点难看,但这取决于你想如何执行代码。使用System.Collections.Generic;使用System.Linq;命名空间MyApp{使用System.Reflection;使用MyApp.Commands;类程序{staticvoidMain(string[]args){varmethods=newMyCommands();方法信息我的方法;myMethod=CommandFactory.GetCommandMethod("显示命令");myMethod.Invoke(方法,空);myMethod=CommandFactory.GetCommandMethod("关闭窗口");myMethod.Invoke(方法,空);myMethod=CommandFactory.GetCommandMethod("切换窗口");myMethod.Invoke(方法,空);}}publicstaticclassCommandFactory{privatestaticDictionaryspeechMethods=newDictionary();publicstaticMethodInfoGetCommandMethod(stringcommandText){MethodInfomethodInfo;varcommands=newMyCommands();如果(speechMethods.Count==0){varmethodNames=typeof(MyCommands).GetMethods(BindingFlags.Public|BindingFlags.DeclaredOnly|BindingFlags.Instance);varspeechAttributeMethods=methodNames.Where(y=>y.GetCustomAttributes().OfType()。任何());foreach(varspeechAttributeMethodinspeechAttributeMethods){foreach(varattributeinspeechAttributeMethod.GetCustomAttributes(true)){speechMethods.Add(((CommandAttribute)attribute).Command,speechAttributeMethod);}}methodInfo=speechMethods[commandText];}else{methodInfo=speechMethods[commandText];}返回方法信息;}}}namespaceMyApp.Commands{classMyCommands{[Command("ShowAll")][Command("ShowAllCommands")][Command("Showcommands")]publicvoidShowAll(){ProgramCommands.ShowAllCommands();}[Command("关闭窗口")]publicvoidCloseWindow(){ControlCommands.CloseWindow();}[Command("切换窗口")]publicvoidSwitchWindow(){ControlCommands.SwitchWindow();}}[System.AttributeUsage(System.AttributeTargets.Method,AllowMultiple=true)]publicclassCommandAttribute:System.Attribute{publicstringCommand{get;放;}publicCommandAttribute(stringtextValue){this.Command=textValue;}}}我知道答案有点晚了,为了不滥用SOLID原则,你可以使用接口或继承在这个例子中,我使用继承,因为你可能有“命令”字符串的其他用法。以上就是C#学习教程:重构长switch语句分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——publicabstractclasscommandRepository{stringcommand;//如果在其他函数类中没有使用,可以去掉publicabstractvoidDoCommands();}publicclassShowCommands:commandRepository{publicShowCommands(){command="显示命令";//如果在其他函数类中没有使用,可以去掉}publicoverridevoidDoCommands(){ProgramCommans.ShowAllCommands();}}publicclassCloseWindow:commandRepository{publicCloseWindow(){command="关闭窗口";//如果在其他函数类中没有使用,可以去掉}publicoverridevoidDoCommands(){ProgramCommans.关闭窗口();}}publicclassSwitchWindow:commandRepository{publicSwitchWindow(){command="切换窗口";//如果在其他函数类中没有使用,可以去掉}publicoverridevoidDoCommands(){ProgramCommans.切换窗口();}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: