需求:根据传入的action参数,自动构造与之对应的request。
直接上代码。
先定义一个MyRequest类。下有子类:AddRequest,LoadRequest,DeleteRequest。
MyRequest
1
public
class
MyRequest
2 {
3 public string Action { get ; private set ; }
4 // public GridPagerParams Pager { get; private set; }
5
6 public MyRequest()
7 {
8
9 }
10 public virtual string Msg()
11 {
12 return Action.ToString();
13 }
14 }
2 {
3 public string Action { get ; private set ; }
4 // public GridPagerParams Pager { get; private set; }
5
6 public MyRequest()
7 {
8
9 }
10 public virtual string Msg()
11 {
12 return Action.ToString();
13 }
14 }
MyRequest定义了一个虚方法 Msg();
各个子类由于算法不同,可重写该方法。
下面是关键:MyRequestCreator
MyRequestCreator 负责判断参数action,并返回相应的 request.
MyRequestCreator
public
class
MyRequestCreator
{
private static Dictionary < string , MyRequestCreator._newMyType > _CreatorDict = new Dictionary < string , MyRequestCreator._newMyType > ();
private delegate MyRequest _newMyType();
static MyRequestCreator() // 初始化
{
_CreatorDict.Add( " load " , new MyRequestCreator._newMyType( delegate () { return new LoadRequest(); }));
_CreatorDict.Add( " add " , new MyRequestCreator._newMyType( delegate () { return new AddRequest(); })); //
_CreatorDict.Add( " delete " , new MyRequestCreator._newMyType( delegate () { return new MyRequest(); }));
}
public static MyRequest CreateHandler( string action)
{
if (_CreatorDict.ContainsKey(action))
{
MyRequest retHandler = _CreatorDict[action].Invoke();
try
{
return retHandler;
}
catch (Exception e)
{
throw new Exception( " 请求处理失败! " , e);
}
}
return null ;
}
}
{
private static Dictionary < string , MyRequestCreator._newMyType > _CreatorDict = new Dictionary < string , MyRequestCreator._newMyType > ();
private delegate MyRequest _newMyType();
static MyRequestCreator() // 初始化
{
_CreatorDict.Add( " load " , new MyRequestCreator._newMyType( delegate () { return new LoadRequest(); }));
_CreatorDict.Add( " add " , new MyRequestCreator._newMyType( delegate () { return new AddRequest(); })); //
_CreatorDict.Add( " delete " , new MyRequestCreator._newMyType( delegate () { return new MyRequest(); }));
}
public static MyRequest CreateHandler( string action)
{
if (_CreatorDict.ContainsKey(action))
{
MyRequest retHandler = _CreatorDict[action].Invoke();
try
{
return retHandler;
}
catch (Exception e)
{
throw new Exception( " 请求处理失败! " , e);
}
}
return null ;
}
}
客户端调用时:
MyRequest request = MyRequestCreator.CreateHandler("load");
这样就可以生成MyRequest的具体子类,并以MyRequest方式使用它的功能。
整个过程完全没有if或者case,配合emit还可以实现动态增加MyRequest的子类并注册到MyRequestCreator中去。
更重要的是,使用这种方式,比根据Activator.CreateInstance(typeof(MyRequest));产生的对象要快的多,接近于直接使用new object()的方式。