C#用什么方法可以减少或不使用switch

shaipe 2013-02-27 10:48:42
如:

public string Exec(string mothedName)
{
string ret = "";
switch (mothedName)
{
case "get":
ret = get();
break;
case"get1":
ret = gettest();
break;
//.....
case "testget":
ret = getrset();
break;
}
return ret;
}

public string get()
{
return "get";
}

public string gettest()
{
return "gettest";
}

public string getrset()
{
return "getset";
}

上面的代码我用什么更好的实现方式可以解决不使用Swicth呢?
请高手们帮我指点一下.
...全文
1840 40 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yun__ 2014-09-22
  • 打赏
  • 举报
回复
调用只需

static void Main(string[] args)
        {
            Console.WriteLine(TestEnum.get.Exec());
            Console.Read();
        }

[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = true)]
    sealed class TestAttribute : Attribute
    {
        private IGetExec ExecObj { get;set; }
        public TestAttribute(Type t)
        {
            this.ExecObj = Activator.CreateInstance(t) as IGetExec;
        }
        public string Exec()
        {
            return ExecObj.GetResult();
        }
    }

public interface IGetExec
    {
        string GetResult();
    }
Yun__ 2014-09-22
  • 打赏
  • 举报
回复
然后扩展其方法

public static string Exec(this TestEnum e)
        {
            Type t = e.GetType();
            var file = t.GetField(e.ToString());
            var att = file.GetCustomAttributes(typeof(TestAttribute), false).Single();
            if (att != null)
            {
                return (att as TestAttribute).Exec();
            }
            else
                return null;
        }
Yun__ 2014-09-22
  • 打赏
  • 举报
回复
我觉得如果一定要去掉switch 可以使用特性修饰Enum

public enum TestEnum
    {
        [Test(typeof(GetExec))]
        get,
        [Test(typeof(Get1Exec))]
        getTest,
        [Test(typeof(GetTestExec))]
        get1
    }
smthgdin_020 2014-09-21
  • 打赏
  • 举报
回复
可以用委托。 当然,如果switch块里几乎不变的话,也没必要换成其他。
我叫小菜菜 2014-09-21
  • 打赏
  • 举报
回复
引用 35 楼 embassy13 的回复:
忍不住,出来卖弄下。 首先,我认为switch的存在,肯定有它的理由,比如:写一个只有几个case分支,分支只有几条语句,这时候你如果用什么委托去不使用switch,那么就有杀鸡用牛刀的 感觉。 反之,面对大量的case分支,分支语句又有50行以上,这时候,头就大了。 代码阅读上,case分支多了,想要看指定的分支,需要滚动鼠标慢慢找, 找到后,面对几十行语句,靠,这分支语句干啥用的。泪奔啊!!! 只好一条一条语句看,看看这分支是干啥用的。(在C++这种情况最明显) 如果,用委托+字典集合处理大量的case分支。在查找上字典至少比switch强,而分支语句被方法封装被委托调用。 如果你方法名取的好的话,就可以立刻大概知道封装的分支语句是干啥的。
+1 其实本质上,switch语句和if-else语句是一样的,都可以互相转换。 在简单的逻辑中,case分支少,很少扩展,那么应该用switch语句,因为简单明了,易于阅读。 如果在复杂的逻辑中,复杂而且混乱的case,如上面所说的50行以上的case分支,而且经常扩展什么的,就应该用委托和反射,使用缓存机制。 设计模式里面,简单工厂模式,内部实例化对象的时候是使用switch语句的。当然可以用反射和委托进行改进。 绕来绕去其实还是这么几种方法,根据实际需要进行适当选择咯!
embassy13 2014-09-20
  • 打赏
  • 举报
回复
忍不住,出来卖弄下。 首先,我认为switch的存在,肯定有它的理由,比如:写一个只有几个case分支,分支只有几条语句,这时候你如果用什么委托去不使用switch,那么就有杀鸡用牛刀的 感觉。 反之,面对大量的case分支,分支语句又有50行以上,这时候,头就大了。 代码阅读上,case分支多了,想要看指定的分支,需要滚动鼠标慢慢找, 找到后,面对几十行语句,靠,这分支语句干啥用的。泪奔啊!!! 只好一条一条语句看,看看这分支是干啥用的。(在C++这种情况最明显) 如果,用委托+字典集合处理大量的case分支。在查找上字典至少比switch强,而分支语句被方法封装被委托调用。 如果你方法名取的好的话,就可以立刻大概知道封装的分支语句是干啥的。
PaulyJiang 2013-10-24
  • 打赏
  • 举报
回复
好东西啊 为什么不用呢?
越过越咸 2013-10-24
  • 打赏
  • 举报
回复
贴的别人的

static void Main(string[] args)
       {
          Console.WriteLine(Exec(GetSet));
          Console.ReadKey();
       }
       //定义委托,用于将方法做为参数传给Exec.
       public delegate string GetResultDelegate();
       public static string Get()
       {
           return "get";
       }
 
       public static string GetTest()
       {
           return "gettest";
       }
 
       public static string GetSet()
       {
           return "getSet";
       }
 
 
       public static string Exec(GetResultDelegate getResult)
       {
           return getResult();
       }
越过越咸 2013-10-24
  • 打赏
  • 举报
回复
实际情况而定吧!
卧_槽 2013-10-24
  • 打赏
  • 举报
回复
切开一个西瓜,你可以用水果刀,菜刀,电锯,油锯或者手劈。 但还是西瓜刀比较顺手。
YapingXin 2013-03-05
  • 打赏
  • 举报
回复
编程这种事,有时候1,你很难就这样拿出一个代码片断来,然后一堆人就开始评头论足。 不知道楼主是不是要做那种可装配/可配置/插件式的程序。 也不知道switch里面的条件是会经常扩展,还是根本就不变,或者就算扩展也是几年才遇到一次的事情... 这些事情都不清楚,你们就争论开了,我真不明白,你们争个JB呀,这么多事情都还不清楚... 同时也提醒楼主,这些前提条件你是不是也该补充说明一下?
#blackheart 2013-03-05
  • 打赏
  • 举报
回复
定义一个接口,继承,利用多态
xiaogui340 2013-03-05
  • 打赏
  • 举报
回复
switch可以用吧,简单明了,是嫌代码长了不好看?ls说搞反射或委托,不是反而降低的代码的易读性么
Frog1228 2013-03-05
  • 打赏
  • 举报
回复
引用 20 楼 souleyes 的回复:
switch 很简洁明了为什么不用呢? 除非你要elseif
这就像有些人喜欢将代码拷贝复制,把参数改改,连个方法都不写。
Frog1228 2013-03-05
  • 打赏
  • 举报
回复
委托和反射。 从上面知道还可以用设计模式。
stonespace 2013-03-05
  • 打赏
  • 举报
回复
没必要刻意减少switch,如果switch更自然,为何不用?
  • 打赏
  • 举报
回复
首先一点是要考虑到,能不搞这类所谓的解析(反射)就一定不要这样设计程序。如果这样考虑,那么就不会写很多诡异的switch了。 只有特定的时候才需要。而一个大项目往往只有一两个地方这样写。而绝对不是到处滥用这种代码。
O西瓜 2013-03-05
  • 打赏
  • 举报
回复
1,设计模式中的责任链模式就是专门解决此类问题的 2,建立一个字典,存储name和调用方法的委托,上面已有人给出
风吹腚腚凉 2013-03-04
  • 打赏
  • 举报
回复
用反射 长度不够
sunlu1987 2013-03-04
  • 打赏
  • 举报
回复
MARK一下,感觉很有用
加载更多回复(19)

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧