c# - 需要在C#中创建大型switch语句的摘要

好吧,我不知道如何很好地解释它。但是我有一个switch语句,

string mystring = "hello";
switch(mystring)
{
case "hello":
break;
case "goodbye":
break;
case "example":
break;
}


当然,这只是一个例子,在实际情况下,每种情况都会发生不同的事情。
好的,希望您能理解这一点,现在,由于不同案例的数量众多,手动执行此操作是不可能的。我需要分别创建所有情况的列表,例如,..对于上述switch语句,我需要

string[] list = { "hello", "goodbye", "example" };


也许可以用foreach完成一些我不知道的方法,任何帮助将不胜感激。

另外,提供的任何工作代码都很棒!

编辑:
人们要求提供更多细节,所以这是它的工作原理。
程序的用户输入一系列字符串。
根据他们输入的字符串,它将执行几个if和else if并基本上放弃新的字符串。我需要能够通过程序创建所有可用选项的列表。而且我不能只列出一个列表并对其进行硬编码,因为我总是在语句中添加更多的大小写,而且我不能回头并保持列表为最新。

最佳答案

这取决于您要获得的技巧...您可以创建一个自定义属性,该属性使用方法应处理的字符串附加到方法。然后,不用switch语句,只需查找具有所需值的属性并执行它即可。

using System;
using System.Reflection;

namespace ConsoleApplication1 {
    [AttributeUsage(AttributeTargets.Method)]
    internal class ProvidesAttribute : Attribute {
        private String[] _strings;
        public ProvidesAttribute(params String[] strings) {
            _strings = strings;
        }
        public bool Contains(String str) {
            foreach (String test in _strings) {
                if (test.Equals(str)) {
                    return true;
                }
            }
            return false;
        }
    }

    internal class Program {
        [Provides("hello", "goodbye")]
        public void HandleSomeStuff(String str) {
            Console.WriteLine("some stuff: {0}", str);
        }

        [Provides("this")]
        public void HandleMoreStuff(String str) {
            Console.WriteLine("more stuff: {0}", str);
        }

        public void HandleString(String str) {
            // we could loop through each Type in the assembly here instead of just looking at the
            // methods of Program; this would allow us to push our "providers" out to other classes
            MethodInfo[] methods = typeof(Program).GetMethods();
            foreach (MethodInfo method in methods) {
                Attribute attr = Attribute.GetCustomAttribute(method, typeof(ProvidesAttribute));
                ProvidesAttribute prov = attr as ProvidesAttribute;
                if ((prov != null) && (prov.Contains(str))) {
                    method.Invoke(this, new Object[] { str } );
                    break;  // removing this enables multiple "providers"
                }
            }
        }

        internal static void Main(String[] args) {
            Program prog = new Program();
            foreach (String str in args) {
                prog.HandleString(str);
            }
        }
    }
}


一旦有了框架,就无需更改HandleString()代码,只需添加要使用的方法并在其上设置Provides属性即可。如果您想进一步扩展这个想法,可以创建多个类来处理各种各样的字符串,然后遍历程序集中的每种类型以查找Provides属性。

编辑这具有一个额外的好处,即您可以定义作用于同一字符串的多个方法(通过在循环逻辑中删除break)。

本文翻译自 https://stackoverflow.com/questions/1647278/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 c# switch-statement summary


相关文章:

c# - 创建连接(对象)池-是否要使用任何库?

c# - 服务器还原数据库失败

mysql - 在案例循环中创建多个数学语句mysql

html - 详细信息和摘要:删除或隐藏“箭头”

swift - 如何缩短此开关盒?

html - Silverstripe 3:如何从EditForm视图中的GridField中删除html文本?

c# - 使用LINQ从FK相关表访问信息

c# - 必须启用SSL才能连接到https站点?

c - 如何解决C中的这种切换情况菜单错误?

android - 如何使用带微调器的开关?