实战小技巧系列(1):使用索引器解决参数统一解析

  MSDN中的名词解释:索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同的是它们的访问器采用参数。

  问题场景:模拟google可拖动模块,并且可以针对各自的模块设置不同的参数,从而使得各模块的显示方式或显示数据根据所设置的参数来呈现。这时问题就出来了,因为不同的模块对应不同的参数设置,这些参数并没有统一性,那怎么用统一的方法来处理这些不同模块参数呢?目前,为了共用性,我们特别设置了参数的解析方法:


  1、当设置好各个模块参数保存时,所有的模块参数都统一解析成特定的字符串格式:参数1名称=参数1值@参数2名称=参数2值,这样做的好处就是,不管你有多少模块,也不管以后各模块的参数是否需要再增加,都不影响这些参数的解析,便于扩展。

  2、当在前台需要呈现这些模块时,把1中保存时的参数字符串传到入各自的模块中,再根据参数的格式进行反解析,从而得到原来的值,代码如下:

protected void InitParams(Dictionary<string, string> param, string paramValue)
{
  string[] aParams = paramValue.Split('@');
  int length = aParams.Length;

  for (int j = 0; j < length; j++)
  {
    int i = aParams[j].IndexOf('=', 0);
    if (i != -1)
    {
      string[] aParam = new string[2];
      aParam[0] = aParams[j].Substring(0, i);
      aParam[1] = aParams[j].Substring(i + 1, aParams[j].Length - i - 1);
      param[aParam[0]] = aParam[1];
    }
  }
}

  这样,在模块加载时,我们可以通过param["参数名"]可以取得相应的值,从而来进行相应的操作,这样的确很方便。而且这样的操作,一开始并没有出现什么问题,一切运行正常。可随着模块的升级,由于需要会在以后的升级中不断的增加各自的参数项,当把这些更新到程序中时,则对于原有的模块参数解析则出现异常情况。这是由于新增了参数项,在程序中增加了对该参数项的判断,如param["PageSize"],但原有已经在运行的模块中,并没有这个参数,这导致 param["PageSize"]并不存在,则会抛出异常。

  解决方案:

  1、针对这种情况,我想很多人一开始就会想到,来一个异常捕获就可以轻易解决。如:

private int PageSize
{
get
{
try
{
return Convert.ToInt32(param["PageSize"]);
}
catch
{
return 10;
}
}
}

  这样做,确实可以解决问题,但我想大家都不愿意这样来做,一来,通过异常捕获来设置默认值效率可想而知的;二来,这样做,就意味着我每增加一个参数项,针对老版本的兼容,我必须都得通过这样的方法去设置该参数的默认值,这样不仅不利于维护,也使得代码一团糟。显然这种方法不值得推荐的。

  2、既然通过异常捕获方式行不通,怎么样即可以直接通过param["PageSize"]来获取参数值,而又不会因为是新增参数而抛异常呢。这里就可以通过索引器来实现了。

  索引器类似于属性,可以用set和get属性设置,从而在赋值或者取值的同时对值进行一定的事先操作,这样,我们把上面提到的InitParams函数中param参数重新包装一下,通过索引器去读取Dictionary字典中的数据。

public class ParamModel
{
protected Dictionary<string, string> param;

public ParamModel()
{
this.param = new Dictionary<string, string>();
}

public string this[string paramName]
{
get
{
if (this.param.ContainsKey(paramName))
{
return this.param[paramName];
}
else
{
if (paramName == "PageSize")
{
return "10";
}
else
{
return "0";// }
}
}
set
{
this.param[paramName] = value;
}
}

public string GetParams()
{
string str = "";
foreach (string s in param.Keys)
{
if (str == "")
{
str = s + "=" + param[s];
}
else
{
str += "@" + s + "=" + param[s];
}
}
return str;
}
}

  通过索引器来解决本例中的问题,再恰当不过了。以后不管参数项增加还是减少,都不影响模块参数的读取。

  本文是针对实际工作中遇到的问题分析,从中找到本人认为最恰当的方法来解决,仅作参考。

posted on 2008-03-24 20:42  李.net  阅读(1962)  评论(0编辑  收藏  举报

导航