泛型方法中类型判断的问题
我想实现这样一个方法:
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
再解决你的判断类型的问题