日期:2014-05-19  浏览次数:20471 次

泛型方法中类型判断的问题
我想实现这样一个方法:
                public   IList <T>   GetGroupInfoList <T> (Guid   uid)
                {
                        IList <T>   list   =   new   List <T> ();
                        如果T是XX类,则SQL语句为=“...”
                        如果T是YY类,则SQL语句为=“...”

                        执行数据查询
           
                        返回的字段填充到object[]中
                          T   t   =   new   T(object[])   //T的构造函数均是这样的   T(params   objcet[]   arr)
                        list.add(t)
                        return   list;
                }

就是上面这样的功能,该怎么实现呢?

------解决方案--------------------
if (typeof(T) is XX)
{
}
else if (typeof(T) is YY)
{
}
------解决方案--------------------
public IList <T> GetGroupInfoList <T> (Guid uid)
{
IList <T> list = new List <T> ();
如果T是XX类,则SQL语句为=“...”
if(typeof(T)==typeof(XX))
...
如果T是YY类,则SQL语句为=“...”
if(typeof(T)==typeof(YY))
..
执行数据查询

返回的字段填充到object[]中
T t = new T(object[]) //T的构造函数均是这样的 T(params objcet[] arr)
list.add(t)
return list;
}

------解决方案--------------------
最终写出来的东西是这样的:

public IList <T> GetGroupInfoList <T> (Guid uid): where T: myT
{
IList <T> list = new List <T> ();
T t = new T(uid) // myT的构造函数均是这样的 myT(Guid uid)
list.add(t)
return list;
}

------解决方案--------------------
你把问题搞复杂了,太有才了,所以反而整出了问题。

对于:
如果T是XX类,则SQL语句为=“...”
如果T是YY类,则SQL语句为=“...”

执行数据查询

返回的字段填充到object[]中
的处理应该是各种T从myT继承而来的,各个T在new(guid)构造方法中只需要知道自己的SQL,调用myT中定义的Protected的数据查询方法,把object[]消化在自己类型内部。

面向对象不是大杂烩,多态的关键就是根本上消去对类型的“switch...case...”或者说连续的“if...else if....”结构。你看看各种多态应用,是不是这样的?

这样做了之后,不用在设计一个类型处理流程时把其它类型都杂烩在一起,扩展的时候也不需要重构。而你的原来的那段代码,当T是其它类型时,就必须重构,否则逻辑就彻底乱了——没有考虑所有子类而仅仅考虑了两种子类,所以一看就是用面向对象的语法代码来偷运结构化的设计思想的。
------解决方案--------------------
最好是先定义一个基类baseGroup,其中包含带有构造函数含有参数object[]
然后在泛型的约束中where T: baseGroup
再解决你的判断类型的问题