无法隐式转换类型';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
{
}
我的问题是:
如何将两个单独的列表添加到一个对象中?
如果我在GetSearchFilter对象中添加一个列表,上面写着:,我会收到一个错误
无法将类型隐式转换为
System.Collection.Generic.List
到System.Namespace.GetSearchFilterResult()
方法。如何修复此错误?
您的问题是返回的是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");