代码之家  ›  专栏  ›  技术社区  ›  Gucci

函数,可以返回任何类型的列表

  •  1
  • Gucci  · 技术社区  · 7 年前

    我正在编程一个函数,其中 DataTable 函数应该识别类型并将数据表转换为其类型的列表。但我的问题是,每当我返回列表时,就会出现一个错误:

    无法隐式转换类型

    'System.Collections.Generic.List<ADMPortal_2.Modles.ProductionPending>' 
    

    'System.Collections.Generic.List<T>'
    

    现在,如何创建一个函数来返回任何类型的 list<> 是吗?

    例如

    List<ProductionPending>
    List<ProductionRecent>
    List<MirrorDeployments>
    

    功能

    public List<T> ConvertToList<T>(DataTable dt, int listType)
        {
    
            if (listType == 1)
            {
                List<ProductionPending> list = new List<ProductionPending>();
                list = ConvertToProductionPending(dt);
                return list; 
            }
            else if (listType == 2)
            {
                List<ProductionRecent> list = new List<ProductionRecent>();
                ConvertToProductionRecent(dt);
                return list; 
            }
            else if (listType == 3)
            {
                List<MirrorDeployments> list = new List<MirrorDeployments>();
                list = ConvertToMirror(dt);
                return list; 
            }
            return list;
        }
    

    调用函数

    下面的代码是调用上述函数的经典方法。

            using (OracleConnection conn = new OracleConnection(cnnStr))
            {
                using (OracleCommand objCommand = new OracleCommand(strSql, conn))
                {
                    objCommand.CommandType = CommandType.Text;
                    DataTable dt = new DataTable();
                    OracleDataAdapter adp = new OracleDataAdapter(objCommand);
                    conn.Open();
                    adp.Fill(dt);
                    if (dt != null)
                    {
    
                        list = ConvertToList<T>(dt, 1).ToList();
                    }
                }
            }
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   MakePeaceGreatAgain    7 年前

    你的方法的问题是你的类型没有太多的共同点。仅仅因为某个类具有某种继承关系并不意味着该类的列表具有相同的关系。换句话说:A List<Derived> 可转换为 List<Base> 是的。

    如果 List<T> 是共同变异-这不是因为以下原因。想象一下你的客户 ConvertToList -方法执行如下操作:

    var list = ConvertToList<MyBaseClass>(theTable, 1)
    

    现在您还可以执行以下操作:

    list.Add(new ProductionRecent());
    

    这可能不是你想要的。所以你需要一些收藏 只读 ,这意味着您不能向它添加实例。因此 IEnumerable<T> -接口 共同变量,可以用作方法的返回类型。

        2
  •  0
  •   Jonatan Dragon    7 年前

    IEnumerable正在使用 out 关键字的泛型类型,因此您可以返回使用派生类型。那么这样的事情怎么样:

            public static IEnumerable<IBase> ConvertToList(int listType)
        {
    
            if (listType == 1)
            {
                var list = new List<ClassA>();
                ...
                return list;
            }
            if (listType == 2)
            {
                var list = new List<ClassB>();
                ...
                return list;
            }
            if (listType == 3)
            {
                var list = new List<ClassC>();
                ...
                return list;
            }
            return null;
        }
    }
    
    public class ClassA : IBase
    { }
    public class ClassB : IBase
    { }
    public class ClassC : IBase
    { }
    public interface IBase
    { }
    

    更多信息请点击此处: Covariance and Contravariance in Generics

        3
  •  0
  •   nvoigt    7 年前

    正如你所说,他们有一个共同的基类:

    public List<CommonBaseClass> ConvertToList(DataTable dt, int listType)
    {
        var result = List<CommonBaseClass>();
    
        if (listType == 1)
        {
            result.AddRange(ConvertToProductionPending(dt));
        }
        else if (listType == 2)
        {
            result.AddRange(ConvertToProductionRecent(dt));
        }
        else if (listType == 3)
        {
            result.AddRange(ConvertToMirror(dt));
        }
    
        return result;
    }
    
    推荐文章