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

原文 标签 c# switch-statement summary

好吧,我不知道如何很好地解释它。但是我有一个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)。

相关文章:

c# - 在基于DLL更改的.NET项目中实现缓存清除的最佳方法是什么?

c# - 如何在客户端系统上调试C#应用程序?

c# - IEnumerable有多个数据成员

c++ - C ++使用int从列表中设置枚举

r - R:避免summary.plm

c# - 在这种情况下如何调用ICommand.CanExecute?

c# - switch语句可以保证顺序吗?

ruby - Ruby:条件矩阵?有多个条件的情况?

android - Android偏好设置摘要默认颜色?

c# - 如何在另一个类中继承C#的摘要? (例如继承Javadoc)[重复]