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

有在论坛看见一帖,《C#用什么方法可以减少或不使用switch

 

Insus.NET的解决方法,是使用工厂方法来处理,可以创建一个工厂接口,然后每个方法设计为一个工厂类,并实现工厂接口。

工厂接口:

IGetFactory
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for IGetFactory
/// </summary>
namespace Insus.NET
{
    public interface IGetFactory
    {
        string GetResult();
    }
}


Get工厂类:

GetFactory
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for GetFactory
/// </summary>
namespace Insus.NET
{
    public class GetFactory : IGetFactory 
    {
        public GetFactory()
        {
            //
            // TODO: Add constructor logic here
            //
        }

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


GetTest类:

GetTestFactory
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for GetTestFactory
/// </summary>
namespace Insus.NET
{
    public class GetTestFactory : IGetFactory 
    {
        public GetTestFactory()
        {
            //
            // TODO: Add constructor logic here
            //
        }

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


以及GetSet类:

GetSetFactory
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for GetSetFactory
/// </summary>
namespace Insus.NET
{
    public class GetSetFactory : IGetFactory 
    {
        public GetSetFactory()
        {
            //
            // TODO: Add constructor logic here
            //
        }

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


因此你的代码最终变为:

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Insus.NET;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

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

        IGetFactory get = new GetTestFactory();  //这里是实现工厂类
        ret = get.GetResult();
        return ret;
    }

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

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

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

 


15:50修改补充如下
上面的最终代码,无传入参数mothedName,怎样办,我们可以虑一下反射,如果改为反射击,那传入的参数需要规范一下方可以:

"get" >>"Get";
"get1" >>"GetTest"
"testget" >> "GetSet"

 这样一改之后,就可以使用反射语法了,可以把

IGetFactory get = new GetTestFactory();  //这里是实现工厂类


改为(下面是asp.net的应用):

Reflection
IGetFactory get = (IGetFactory)Assembly.Load("App_Code").CreateInstance("Insus.NET." + mothedName + "Factory");


如果在非asp.net下,可以把"App_Code"改为"程序集名称":

View Code
IGetFactory get = (IGetFactory)Assembly.Load("程序集名称").CreateInstance("Insus.NET." + mothedName + "Factory");

 

 

posted @ 2013-03-04 13:56  Insus.NET  阅读(2243)  评论(5编辑  收藏  举报