目前要实现一个这样的功能:通过一个方法添加多种类型的对象列表 所有类型都派生自 BaseItem
 通过泛如何实现????????class a:BaseItem
{
}
class b:BaseItem
{
}
class c:BaseItem
{
}
List<a> lista = new List<a>(); 
List<b> listb = new List<b>();
List<c> listc = new List<c>();public bool AddItem(lista,listb,listc)
{
   base.addItemList<T>(lista);//T可能为a,b,c对于addItemList中已约束T必须派生自BaseItem
}请问 AddItem这个方法如何写,,主要是参数如何传递。

解决方案 »

  1.   

            static bool AddItem(List<BaseItem> lista, List<BaseItem> listb, List<BaseItem> listc)
            {
                List<a> la = new List<a>();
                List<b> lb = new List<b>();
                List<c> lc = new List<c>();            la.AddRange(lista.ConvertAll<a>(delegate (BaseItem Item){return (a)Item;}));
                lb.AddRange(listb.ConvertAll<a>(delegate(BaseItem Item) { return (b)Item; }));
                lc.AddRange(listc.ConvertAll<a>(delegate(BaseItem Item) { return (c)Item; }));
                return true;
            }
      

  2.   

    la.AddRange(lista.ConvertAll<a>(delegate (BaseItem Item){return (a)Item;}));
                lb.AddRange(listb.ConvertAll<b>(delegate(BaseItem Item) { return (b)Item; }));
                lc.AddRange(listc.ConvertAll<c>(delegate(BaseItem Item) { return (c)Item; }));
                
      

  3.   

    class a : BaseItem
        {
        }
        class b : BaseItem
        {
        }
        class c : BaseItem
        {
        }
        class BaseItem
        {
        }
        class Class1
        {
            List<a> lista = new List<a>();
            List<b> listb = new List<b>();
            List<c> listc = new List<c>();         public bool AddItem(BaseItem lista,BaseItem listb,BaseItem listc) 
            {
                List<BaseItem> addItemList = new List<BaseItem>();//T可能为a,b,c对于addItemList中已约束T必须派生自BaseItem 
                addItemList.Add(lista);
                addItemList.Add(listb);
                addItemList.Add(listc);
                return true;
            } 
        }
      

  4.   

    public bool AddItem<T>(T a) where T : BaseItem
    {
        //是这么写的吗

      

  5.   

     public bool Add<T>(T t) where T : Castle.ActiveRecord.ActiveRecordBase
            {
                try
                {
                    t.Create();
                    return true;
                }
                catch
                {
                    return false;
                }
            }if (DataAccess.DataAccess.GetDb.Add<Entity.AwardpunishInfo>(ap))//就是你需要的类型
                {
                    return "添加成功";
                }
                else
                {
                    return "添加失败";
                }
      

  6.   

    非常感谢大家都回答前面说多大泛型方法我都已经实现。。
    补充说明:
    我需要带n个对象类型的List列表进去。而不是一个。类型方法必须要求是强类型。而不能通过getType和typeof动态得到。。例如:
     class a:BaseItem 


    class b:BaseItem 


    class c:BaseItem 


    List <a> lista = new List <a>(); 
    List <b> listb = new List <b>(); 
    List <c> listc = new List <c>(); 知道参数个数的话我可以这样实现:public bool AddItem<a,b,c>(List<a> lista,List<b> listb,List<c> listc)
    {
       base.addItemList<a>(lista); 
                base.addItemList<b>(listb); 
                base.addItemList<c>(listc); 
    } 而我想实现的是AddItem的参数可以是多个。如parames 一样。而不是固定几个。
    请问如何实现???
      

  7.   

    完全不必考虑where T : BaseItem 
    约束。这个在接口和基类里面已经约束。。并且都加入了new()约束。。允许直接实例化我只想知道AddItem的参数可以为任意多个。如parames 一样。而不是固定几个。 
    请问如何实现???
      

  8.   

    public bool AddItem<T>(params List<T>[] args) 
    {
           ...
    }
      

  9.   

    而我想实现的是AddItem的参数可以是多个。如parames 一样。而不是固定几个。 
    请问如何实现???你的意思是AddItem方法可以带多个参数是吧?
      

  10.   

    而我想实现的是AddItem的参数可以是多个。如parames 一样。而不是固定几个。 
    请问如何实现??? 你的意思是AddItem方法可以带多个参数是吧?
    是的。我就是希望能带多个参数,每个参数都是一种派生自BaseItem类型的List对象列表请问有好的办法吗? guoyichao 的这个意思不对虽然参数多个。但是类型T只有一种不是我想要的。
    public bool AddItem <T>(params List <T>[] args) 

          ... 
      

  11.   

    C#4.0支持逆变:
    public bool AddItem <in T>(params List <T>[] args) 

          ... 
      

  12.   


    protected virtual IList<Entity> GetEntityList(IDataReader dr)
            {
                IList<Entity> _list = new List<Entity>();
                EntityBuilder<Entity> _eb = EntityBuilder<Entity>.CreateBuilder(dr);
                while(dr.Read())
                {
                    _list.Add(_eb.Build(dr));
                }
                dr.Close();
                dr.Dispose();
                return _list;
            }
      

  13.   

    加为好友 
    发送私信 
    在线聊天
     gui0605 
    菜菜 
    等级: 
    可用分等级:掌柜 
    总技术分:11012 
    总技术分排名:1909  发表于:2009-06-09 18:33:1519楼 得分:0 
    C# code
    protected virtual IList<Entity> GetEntityList(IDataReader dr)
            {
                IList<Entity> _list = new List<Entity>();
                EntityBuilder<Entity> _eb = EntityBuilder<Entity>.CreateBuilder(dr);
                while(dr.Read())
                {
                    _list.Add(_eb.Build(dr));
                }
                dr.Close();
                dr.Dispose();
                return _list;
            }
     
     这个看到不是很明白好像跟本题没关系吧[color=#FF0000][/color]
      

  14.   

    guoyichao 
    guoyichao 
    等级: 
    可用分等级:掌柜 
    总技术分:1431 
    总技术分排名:15651  发表于:2009-06-09 18:18:1018楼 得分:0 
    C#4.0支持逆变: 
    public bool AddItem <in T>(params List <T>[] args) 

          ... 

     
     我用的是2.0 还有别的办法吗?
      

  15.   

    需要带n个对象类型的List列表进去
    在.net 2.0里面即使T1和T2有继承关系,List<T1>和List<T2>被认为是没有任何关系的
    所以,在用params时,需要把类型定义成一个公共的抽象的类型,例如IList类型方法必须要求是强类型
    如果参数被定义成:params IList[] lists,那么就不是强类型的
    而且不用GetType动态得到真实类型的话,编译时根本无法知道具体类型所以,无解变通方法:
    学习Action<T>,Action<T1,T2>,Action<T1,T2,T3>...的用法,.net 4.0里面就定义了15个Action,一般情况下够用了
      

  16.   


    我需要带n个对象类型的List列表进去。而不是一个。类型方法必须要求是强类型。而不能通过getType和typeof动态得到。。 

    为什么?你都继承与BASEITEM,你一个T就可以了。
    其次为什么你这里要用泛型?你这里明明就用一个BASEITEM就可以了。
    不要为了用泛型而用,泛型只是一种辅助手段。