以下代码如何使用委托减少switch case,达到便于维护,高可扩展的目的。

qq_24859323 2016-09-14 08:45:20
        /// <summary>
/// Redis缓存机制(适用于静态数据)
/// </summary>
/// <param name="context"></param>
/// <param name="t">类名</param>
/// <param name="mth">方法名</param>
/// <param name="key">设置Redis中的键名</param>
/// <param name="ts">设置参数类型</param>
/// <param name="o">设置参数名称</param>
/// <param name="type">设置数据库类型</param>
public void RedisCache(HttpContext context, Type t, string mth, string key, Type[] ts, object[] o, DataBaseType type)
{
string json = String.Empty;
if (RedisBase.Item_Exist(key))//判断Redis中,key是否存在;若存在,直接从redis取值,不存在则执行数据库访问方法,这种机制减缓了数据库的压力,提升了系统性能.
{
json = RedisBase.GetValue(key);//根据key获取value
}
else
{
object className = Activator.CreateInstance(t);//反射方法
MethodInfo mInfo = null;
object obj = null;
if (ts != null && o != null)//执行带有多种参数的方法
{
mInfo = t.GetMethod(mth, ts);
obj = mInfo.Invoke(className, o);
}
else//执行无参数的方法
{
mInfo = t.GetMethod(mth);
obj = mInfo.Invoke(className, null);
}
switch (type)//根据数据库类型处理字符串,因富基融通建库时使用的是西欧字符集.
{
case DataBaseType.Oracle:
json = Convert8859P1ToGB2312(JsonConvert.SerializeObject(obj));
break;
case DataBaseType.SQL_Server:
json = JsonConvert.SerializeObject(obj);
break;
}
RedisBase.Item_Set<string>(key, json, 120);//根据key设置value
}
context.Response.Write(json);
context.Response.End();
}

        
public delegate string JsonHandler<T>(T t);//我定义了委托,就不知道如何使用了
public string SendJson_SQL<T>(T t)
{
return JsonConvert.SerializeObject(t);
}

public string SendJson_Ora<T>(T t)
{
return Convert8859P1ToGB2312(JsonConvert.SerializeObject(t));
}
...全文
329 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_24859323 2016-09-14
  • 打赏
  • 举报
回复
引用 10 楼 starfd 的回复:
RedisCacheForOracle RedisCacheForMsSql 方法都给你独立出来了啊
明白了,谢谢,还有个问题:如果方法不要独立出来,我调用的时候直接这样:

FatherHandler fth=new FatherHandler();
fth.RedisCache(context, d.GetType(), "GetShop", "ShopInfo", null,null,XXX.MsSql);
用什么方法,可以实现呢
  • 打赏
  • 举报
回复
RedisCacheForOracle RedisCacheForMsSql 方法都给你独立出来了啊
qq_24859323 2016-09-14
  • 打赏
  • 举报
回复
引用 7 楼 starfd 的回复:
Func<string> jsonFunc
//改为
Func<object,string> jsonFunc
//然后方法传递
jsonFunc(obj);
(obj) =>
    {
        return Convert8859P1ToGB2312(JsonConvert.SerializeObject(obj));
    });
请问下如何调用呢?

fth.RedisCache2(context, d.GetType(), "GetShop", "ShopInfo", ????);
qq_24859323 2016-09-14
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
你看下Func和Action,他们实际究竟是什么……
我的意思是说 如果使用

public delegate string JsonHandler<T>(T t);
调用的时候

public void RedisCache1(HttpContext context, Type type, string mth, string key, Type[] ts, object[] o, JsonHandler<object> t)
是不是没意义?必须要用到Action Func
  • 打赏
  • 举报
回复
Func<string> jsonFunc
//改为
Func<object,string> jsonFunc
//然后方法传递
jsonFunc(obj);
(obj) =>
    {
        return Convert8859P1ToGB2312(JsonConvert.SerializeObject(obj));
    });
  • 打赏
  • 举报
回复
你看下Func和Action,他们实际究竟是什么……
qq_24859323 2016-09-14
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
另外看你这个方法名,正常情况下,这代码不应该在UI层,而是在业务层,而如果是业务层的话,那context这跟UI层紧密关联的东西就不应该传递过来,而且我也没看到你这个context到底有什么用,就是为了将内容在方法内就输出而已
请问下obj,在哪里传值呢?
qq_24859323 2016-09-14
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
另外看你这个方法名,正常情况下,这代码不应该在UI层,而是在业务层,而如果是业务层的话,那context这跟UI层紧密关联的东西就不应该传递过来,而且我也没看到你这个context到底有什么用,就是为了将内容在方法内就输出而已
这个是ashx,一些公共的方法都在这里,请问下delegate 是不是不支持泛型,只能使用Func或者Action?
  • 打赏
  • 举报
回复
另外看你这个方法名,正常情况下,这代码不应该在UI层,而是在业务层,而如果是业务层的话,那context这跟UI层紧密关联的东西就不应该传递过来,而且我也没看到你这个context到底有什么用,就是为了将内容在方法内就输出而已
  • 打赏
  • 举报
回复
/// <summary>
/// Redis缓存机制(适用于静态数据)
/// </summary>
/// <param name="context"></param>
/// <param name="t">类名</param>
/// <param name="mth">方法名</param>
/// <param name="key">设置Redis中的键名</param>
/// <param name="ts">设置参数类型</param>
/// <param name="o">设置参数名称</param>
/// <param name="type">设置数据库类型</param>
private void RedisCache(HttpContext context, Type t, string mth, string key, Type[] ts, object[] o, Func<string> jsonFunc)
{
    string json = String.Empty;
    if (RedisBase.Item_Exist(key))//判断Redis中,key是否存在;若存在,直接从redis取值,不存在则执行数据库访问方法,这种机制减缓了数据库的压力,提升了系统性能.
    {
        json = RedisBase.GetValue(key);//根据key获取value
    }
    else
    {
        object className = Activator.CreateInstance(t);//反射方法
        MethodInfo mInfo = null;
        object obj = null;
        if (ts != null && o != null)//执行带有多种参数的方法
        {
            mInfo = t.GetMethod(mth, ts);
            obj = mInfo.Invoke(className, o);
        }
        else//执行无参数的方法
        {
            mInfo = t.GetMethod(mth);
            obj = mInfo.Invoke(className, null);
        }
        json = jsonFunc();
        RedisBase.Item_Set<string>(key, json, 120);//根据key设置value
    }
    context.Response.Write(json);
    context.Response.End();
}

public void RedisCacheForOracle(HttpContext context, Type t, string mth, string key, Type[] ts, object[] o)
{
    RedisCache(context, t, mth, key, ts, o, () =>
    {
        return Convert8859P1ToGB2312(JsonConvert.SerializeObject(obj));
    });
}
public void RedisCacheForMsSql(HttpContext context, Type t, string mth, string key, Type[] ts, object[] o)
{
    RedisCache(context, t, mth, key, ts, o, () =>
    {
        return JsonConvert.SerializeObject(obj);
    });
}
  • 打赏
  • 举报
回复
//定义函数字典 public delegate string JsonHandler(object t); Dictionary<DataBaseType, JsonHandler> handleMap; //定义函数 public string SendJson_SQL(object t) { return JsonConvert.SerializeObject(t); } public string SendJson_Ora(object t) { return Convert8859P1ToGB2312(JsonConvert.SerializeObject(t)); } //在初始化时,初始化函数字典 handleMap = new Dictionary<DataBaseType, JsonHandler>(); handleMap[DataBaseType.Oracle] = SendJson_Ora; handleMap[DataBaseType.SQL_Server] = SendJson_SQL; //处理函数(部分代码省略) public void RedisCache(.....) { ................ //根据数据库类型处理字符串,因富基融通建库时使用的是西欧字符集 if (handleMap.ContainsKey(type)) { json = handleMap[type](obj); } }

110,536

社区成员

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

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

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