对论坛讨论减少switch分支有感,使用特性反射出需要使用的类

今天在论坛上面看到问如何减少switch分支

我自己想了一下,觉得使用特性,可以直接减少switch的判断,于是就写了一些

表示效率可能无法和switch相提并论

下面就开始吧

首先设置接口

public interface IGetExec
    {
        string GetResult();
    }

然后分别实现

public class GetExec : IGetExec
    {
        public string GetResult()
        {
            return "get";
        }
    }
    public class Get1Exec : IGetExec
    {
        public string GetResult()
        {
            return "get1";
        }
    }
    public class GetTestExec : IGetExec
    {
        public string GetResult()
        {
            return "gettest";
        }
    }

创建特性

[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();
        }
    }

定义一个Enum 来判断具体使用哪个类

public enum TestEnum
    {
        [Test(typeof(GetExec))]
        get,
        [Test(typeof(Get1Exec))]
        getTest,
        [Test(typeof(GetTestExec))]
        get1
    }

然后扩展Enum的方法

public static class EnumClass
    {
        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;
        }
    }

最后调用

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

完成只需要扩展IGetExec接口 然后添加enum即可实现扩展功能

时间: 2024-09-30 17:32:51

对论坛讨论减少switch分支有感,使用特性反射出需要使用的类的相关文章

Java基础知识强化19:Java中switch分支语句

java中switch语句: 这里expression控制表达式的数据类型只能是byte.short.char.int四种整型类型和枚举类型,不能是boolean类型: Java7(1.7)改进了switch分支语句: Java7允许switch语句中的控制表达式为java.lang.String类型(不能是StringBuffer 或者 StringBuilder) switch(expression) {     case  condition1:          {          

C#里面的Switch分支结构的使用

在C#这门编程语言里面,不但可以使用if和else来实现分支结构,也可以使用switch来实现分支结构. 构造大致如下: switch(变量值) { case 常量值1: 语句1: break; case 常量值2: 语句2: break: //还可以有多个case分支 default: //default往往是放到最后 语句: break; } 比如:可以借助于switch来实现加减乘除的判断: 代码如下: int 运算数1,运算数2;            string 运算符;      

C语言宏定义##连接符和#符的使用(MFC就是靠##自动把消息和消息函数对应起来了,借助宏来减少switch case代码的编写量)

C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结. 关于#和## 在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量 通过替换后在其左右各加上一个双引号.比如下面代码中的宏: #define WARN_IF(EXP) do{ if (EXP) fprintf(stderr, "Warning: " #EXP &quo

switch 分支语句

描述:根据一个变量的不同取值,来执行不同的代码. 语法结构: switch(变量) { case 值1: 代码1; break; case 值2: 代码2; break; case 值3: 代码3; break; default: 如果以上条件都不满足,则执行该代码; } switch结构说明:    switch.case.break.default都是系统关键字,都必须全小写.  switch后的小括号():小括号内一般是一个变量名,这个变量可能会有不同的取值.  每个case的值,与变量的

读loki有感,编译阶段发现两个类能否转化

开发环境:VS2005(VC8) 以下代码在VS2002上运行不了,据说VS2002(VC7)不完全支持偏特化,VS2003(VC7.1)就支持了. 问题提出: 一,已知类型T,U,在编译阶段如何知道T能否转化成U. template <class T, class U> struct ConversionHelper { static long   Test(...);//WQ注:C++中,不定参数已不需要"至少一个定参"了. static short Test(U);

讨论一下hibernate如何动态注册一个动态生成的实体类(原)

如何动态生成实体类请参考这篇博文:http://www.cnblogs.com/anai/p/4269858.html 下面说说得到实体类后,如何能使用hibernate的接口来进行数据访问. 我们都知道,hibernate是在web容器启动的时候根据相关配置信息,扫描class文件,然后注册到SessionFactory中.通过getAllClassMetadata()可以得到已经注册过的实体类的元信息.那么如果是在容器启动已经完成后,程序正常运行期间产生的类,显然是不能直接使用hiberna

使用特性+反射来做超轻量级的定时调度服务

1.定义特性,特性中包含执行间隔的属性,在每个需要定时调度执行的方法上加上该特性,表示该方法参与定时调度. 2.编写方法,默认在调度服务启动时,会先访问该方法来获取全部需要定时执行的方法和间隔: 3.每个方法执行时,可以向服务返回日志,同时也可以返回下次执行的时间,服务将在指定的时间来调用该服务,默认按调度规则执行.若需要额外指定下次执行的时间可以在返回值中执行: 4.其实可以考虑增加本次调度的间隔参数,以方便被调用服务判断当前执行的间隔是否是常规间隔还是自定义间隔. -------------

【设计模式学习笔记】 之 简单工厂模式

 简介:工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,拒绝客服端程序员通过new创建需要的实例,并且是通过使用一个共同的接口来指向新创建的对象,即接口引用指向实现类对象,是多态的灵活运用. 举例1[未使用工厂模式]: 一个家庭中有多辆汽车,这个家庭想去出游,需要先传一个Car到Family中持有,才能出游. 首先考虑多辆汽车,都有同样的ru

js中switch/case分支的值可以是变量或表达式

在一些高级语言如C#中,switch分支的值只能是常量,而js中可以是变量或表达式: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.