无法隐式转换类型';System.Collections.Generic.List<>';方法

本文关键字:List Generic lt gt 方法 Collections System 类型 转换 | 更新日期: 2023-09-27 18:26:20

我有一个类GetSearchFilters_Results,它有两个列表:

    [DataContract]
    public class GetSearchFilters_Results
    {
        public List<ElementList> ElementList{ get; set; }
        public List<Managers> ManagerList { get; set; }
    }

我有一个名为Service.cs:的文件

    public GetSearchFilters_Results GetSearchFilters(string DomainID)
    {
        //Main List return List 
        //List<GetSearchFilters_Results> SearchFilterResults = new List<GetSearchFilters_Results>();
        //Class
        GetSearchFilters_Results GSF = new GetSearchFilters_Results();
        string cs = ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString;
        try
        {
            using (SqlConnection con = new SqlConnection(cs))
            {
                con.Open();
                SqlCommand cmd = new SqlCommand("spCPMapp_GetSearchFilters", con);
                cmd.Parameters.AddWithValue("@Domain_Id", DomainID);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlDataAdapter sqlDa = new SqlDataAdapter(cmd);
                DataSet Ds = new DataSet();
                sqlDa.Fill(Ds);
                DataTable DtWBS = new DataTable();
                DataTable DTManager = new DataTable();
                sqlDa.Fill(Ds);
                DtWBS = Ds.Tables[0];
                DTManager = Ds.Tables[1];
                //Get WBS Elements List
                if (DtWBS.Rows.Count > 0)
                {
                    List<ElementList> ElementList= new List<ElementList>();
                    for (int i = 0; i < DtWBS.Rows.Count; i++)
                    {
                        ElementList wbs = new ElementList();
                        wbs.ProjectID = Convert.ToInt32(DtWBS.Rows[i]["Project_ID"].ToString());
                        wbs.WBSElementName = DtWBS.Rows[i]["WBSShort"].ToString();
                        WBSElementsList.Add(wbs);
                        //GSF.WBSElementsList.Add(wbs);
                    }
                    GSF.WBSElementsList = WBSElementsList;
                    //SearchFilterResults.Add(GSF);
                }
                //Get Managers List Start
                if (DTManager.Rows.Count > 0)
                {
                    List<Managers> ManagersList = new List<Managers>();
                    for (int i = 0; i < DTManager.Rows.Count; i++)
                    {
                        Managers Mgr = new Managers();
                        Mgr.TimeSheetID = Convert.ToInt32(DTManager.Rows[i]["Project_ID"].ToString());
                        Mgr.ManagerName = DTManager.Rows[i]["Manager"].ToString();
                        //GSF.ManagerList.Add(Mgr);
                        ManagersList.Add(Mgr);
                    }
                    GSF.ManagerList = ManagersList;
                }
                //Manager List End 
            }//Using End 
            //SearchFilterResults.Add(GSF);
        }
        catch (SqlException sqlEx)
        {
            sqlEx.ToString();
        }
        catch (FaultException ex)
        {
            ex.ToString();
        }
        catch (OverflowException e)
        {
            e.ToString();
        }
        return GSF.ManagerList;  // I am getting error, how to add two lists into single objectGetSearchFilters_Results
    }

另一类元素:

 [DataContract]
 public class Elements
 {
 }

我的问题是:

  1. 如何将两个单独的列表添加到一个对象中?

  2. 如果我在GetSearchFilter对象中添加一个列表,上面写着:,我会收到一个错误

    无法将类型隐式转换为System.Collection.Generic.ListSystem.Namespace.GetSearchFilterResult()方法。

    如何修复此错误?

无法隐式转换类型';System.Collections.Generic.List<>';方法

您的问题是返回的是List而不是GetSearchFilter_Results

如果您打算像函数头所说的那样返回GetSearchFilter_Results对象,您可以将最后一行更改为:

return GSF;

编辑并附带说明:

您询问了如何将两个列表相加。假设列表属于同一个对象,则可以使用AddRange()函数,如下所示:

List<string> stringListA = new List<string>();
List<string> stringListB = new List<string>();
stringListA.AddRange(stringListB); // stringListA now holds the elements from both A and B.

又添加了一个,希望我不会添加太多

我还注意到,您无法区分如何捕获每个异常。我不知道你的案例需要什么,但你可以简单地说:来消除几行代码

catch(Exception e)
{
    e.ToString();
}

而不是多个catch语句都做相同的事情。

您为此发布了大量代码。也许可以试着把你的逻辑抽象出来,这样读起来更干净、更容易?

您的问题是试图将List<ManagerList>放入GetSearchFilters_Results的返回中。尽管列表管理器列表是GetSearchFilters_Results的属性,但它们不能作为错误状态"隐式转换"。

你可能想做这样的事情:

[DataContract]
public class GetSearchFilters_Results
{
    public List<ElementList> ElementList{ get; set; }
    public List<Managers> ManagerList { get; set; }
    public GetSearchFilters_Results
    {
        ElementList = new List<ElementList>();
        ManagerList = new List<ManagerList>();
    }
    public GetSearchFilters_Results Execute()
    {
        this.ELementList = this.GetElementList();
        this.ManagerList = this.GetManagerList();
        return this;
    }
    public List<ElementList> GetElementList()
    {
        List<ElementList> list = new List<ElementList>();
        // Get list information from db 
        return list;
    }
    public List<ManagerList> GetManagerList()
    {
        List<ManagerList> list = new List<ManagerList>();
        // Get list information from db 
        return list;
    }
}

您需要函数GetSearchFilters返回

GetSearchFilters_Results 

但你真正返回的是

GSF.ManagerList

属于类型

List<Managers> ManagerList

那是你的错误。无论如何,对于问题的第1部分,您可以创建一个具有两个数据成员的类,每个数据成员都是一个列表,然后在构造函数或单独的函数中,为列表分别传递两个参数:

public Class TwoListsClass
{
List <type1> list1;
List <type2> list2;
    public TwoListsClass (List <type1> list1, List <type2> list2)
    {
        this.list1 = list1;
        this.list2 = list2; 
    }
}

然后,当您完成两个列表的赋值时,您可以调用您编写的构造函数或函数。

哇,这是一种古老而艰难的做事方式。。。。考虑一下:您已经有两个模型了。

public List<ElementList> ElementList{ get; set; }
public List<Managers> ManagerList { get; set; }

这告诉我是可以从EF生成的,这很好。。。。

现在,EF中有一种鲜为人知但非常酷的方法,看起来像这样:

    public List<MyType> QueryThis(ViewModel vm)
    {
        using (var db = new MyEntities()){
        var parms = GetParms(vm);
        var query = Resources.QueryStrings.MyQuery;
        var stuff = db.Database.SqlQuery<MyType>(query, parms);
        return stuff.ToList();
    }

强调传递到SQLQuery中的类型

因此,您真正需要做的就是提供一个新的模型,该模型将组合您想要返回的所有字段,SQL将自动为您填充这些字段。类MyType将具有两个模型中的所有字段。SQL还知道如何填充基类,这样您就可以从一个类继承,只需输入较小类的字段。不再进行解析,甚至不再多次访问数据库。只需调整查询即可一次性获得所需内容。

从这一点开始的所有过滤都可以使用LINQ。。。这是使用ADO.NET断开连接模式概念的新方法。当你对此进行更深入的研究时,你会发现存储库,但这是另一天的事情。

var filtered = MyTypeList.Where(p=>p.ManagerName == "SomeValue");
var filtered = MyTypeList.Where(p=>p.ElementType == "Somevalue");