我想实现这样一个方法:
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;
}就是上面这样的功能,该怎么实现呢?
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;
}就是上面这样的功能,该怎么实现呢?
解决方案 »
- 如何将DataTable中的某一列的值直接放到一个ArrayList对象中?
- design视图不能用
- 投票问题,请高手进来看看?在线等!
- 如何绕过前台JS验证和修改一用户的SESSION?
- 高分请教:DropDownList控件,点击IE回退,该控件被遮盖
- asp.net C#2005 gridview新添的模板列checkbox 如何改变样式?
- 利用sqldataadapter中的insertcommand怎么实现不了插入数据呢?请指教
- 关于框架中如何传递参数
- 各位大侠请进! 为什么 datagrid 的模板绑定列的值读不出来???
- 如果listbox中有几个listitem的VALUE是相同的,就只能选中序号最小的那个吗?
- 使用Label读取库中大段信息,怎样实现自动换行?
- 见鬼啦:页面postback后,写js alert后,css样式表部分样式在ie里丢失~!ff里没问题~!
我有时只需查询出一组ID Name 形成List<X> 然后交给ObjectDataSource
Class X中有字段ID Name
有时只需查询出一组ID Intro 形成List<Y> 然后交给ObjectDataSource
Class Y中有字段ID Intro
{
}
else if (typeof(T) is YY)
{
}
{
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;
}
if (typeof(T) is XX) 给定表达式始终不是所提供的(“XX”)类型
错误:
T t = new T(object[]) 这里变量类型“T”没有 new() 约束,因此无法创建该类型的实例
那二个错误呢?
public IList<T> GetGroupInfoList<T>(Guid uid)
where T: new()
出现的错误是: T t = new T(object[]) “T”: 创建变量类型的实例时无法提供参数
传入的类型的构造函数均是X(params objcet[] arr) 或 Y(params objcet[] arr)
但是在这个泛型方法里,T当然是未知的,所以是否需要采用另一种方法,如接口或抽象基类
错误消息
“identifier”:创建变量类型的实例时无法提供参数如果对类型参数上的 new 运算符的调用带有参数,则会发生此错误。可以使用未知参数类型上的 new 运算符调用的唯一构造函数是不带参数的构造函数。如果需要调用另一个构造函数,请考虑使用类类型约束或接口约束。但是用接口约束,接口不可以有构造函数的啊,用了类类型约束,还是同样的错误-_-!
{
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是其它类型时,就必须重构,否则逻辑就彻底乱了——没有考虑所有子类而仅仅考虑了两种子类,所以一看就是用面向对象的语法代码来偷运结构化的设计思想的。
该怎么设计呢?
然后在泛型的约束中where T: baseGroup
再解决你的判断类型的问题
兄弟太有才了,嘿嘿:)按sp1234所说那样,更好的应该就是XX,YY同时继承于myT,在XX,YY的类中执行SQL语中。无需在进行typeof()判断。
hoho
那我不是要在object中 参入数据层的东西
分清楚了 有助于系统的更改与扩展
class TMenu
{
public TMenu()
{
}
public string getName()
{
return "AAA";
}
}
class menu<T> where T : TMenu, new() {
public T obj;
public menu()
{
}
public menu(T obj)
{
this.obj = obj;
}
public string GetStr()
{
return obj.getName();
}
public string MyCreateObj()
{
T KK = new T();//注意这里创建哦.
return KK.getName();
}
} class Test
{
static void Main()
{
menu<TMenu> MyMenu = new menu<TMenu>(new TMenu());
System.Console.WriteLine(MyMenu.MyCreateObj());
}
}
class menu <T> where T : TMenu, new()
你的实例代码是有问题的,如果你加了new(),最后创建类的实例时会因构造函数不能接受参数而编译不通过。而你要不加new(),就不能实例化。我怀疑这是C#语言在泛型编程上的一个局限。