C# 演员名单<;自定义对象>;列出<;对象>;
在我的asp.net应用程序中,我正在创建一个自定义用户控件(类似于GridView)。 它获取一个对象(如汽车、人等)的列表,并将其显示为表格 由于当我尝试将自定义列表转换为对象列表时,对象列表可以是不同的类型,因此会出现如下错误:“无法将类型为“System.Collections.Generic.listC# 演员名单<;自定义对象>;列出<;对象>;,c#,asp.net,list,casting,C#,Asp.net,List,Casting,在我的asp.net应用程序中,我正在创建一个自定义用户控件(类似于GridView)。 它获取一个对象(如汽车、人等)的列表,并将其显示为表格 由于当我尝试将自定义列表转换为对象列表时,对象列表可以是不同的类型,因此会出现如下错误:“无法将类型为“System.Collections.Generic.list1[Main.People]”的对象转换为类型“System.Collections.Generic.list1[System.object]” 有没有更好的方法来处理这个问题 代码如下:
1[Main.People]”的对象转换为类型“System.Collections.Generic.list
1[System.object]”
有没有更好的方法来处理这个问题
代码如下:
public List<object> Objects = new List<object>();
protected void Page_Load(object sender, EventArgs e)
{
Objects = (List<object>) HttpContext.Current.Items["Objects"];
}
<table>
<% int counter = 0; %>
<% foreach (object customObject in Objects)
{ %>
<% counter++; %>
<%PropertyInfo[] propertyInfos = customObject.GetType().GetProperties(); %>
<%--header--%>
<% if (counter == 1)
{
%>
<tr>
<%
foreach (var reportField in propertyInfos)
{
%>
<th>
<%=reportField.Name %>
</th>
<%
}
%>
</tr>
<%
} %>
<%--data rows--%>
<tr>
<%
foreach (var reportField in propertyInfos)
{
%>
<td>
<a href="?page=Details.aspx?<%=reportField.Name %>=<%=reportField.GetValue(customObject, null) %>">
<%=reportField.GetValue(customObject, null)%>
</a>
</td>
<%
}
%>
</tr>
<% }%>
</table>
public List Objects=new List();
受保护的无效页面加载(对象发送方、事件参数e)
{
Objects=(List)HttpContext.Current.Items[“Objects”];
}
您应该能够在Linq中使用Cast()扩展方法
Objects = HttpContext.Current.Items["Objects"].Cast<object>().ToList()
Objects=HttpContext.Current.Items[“Objects”].Cast().ToList()
由于代码中的列表似乎没有实际修改,因此实际上不需要将其作为列表。它可以是一个
IEnumerable
:
公共IEnumerable对象;
受保护的无效页面加载(对象发送方、事件参数e)
{
Objects=(IEnumerable)HttpContext.Current.Items[“Objects”];
}
让你的所有类:汽车、人从基类继承MyBaseClass,并将你的列表转换为该类型/类
public List<MyBaseClass> Objects = new List<MyBaseClass>();
protected void Page_Load(object sender, EventArgs e)
{
Objects = (List<MyBaseClass>) HttpContext.Current.Items["Objects"];
}
请记住,在代码中添加或创建对象列表时,需要将其声明为
List<MyBaseClass> Objects
列出对象
顺便说一句,您当前的列表似乎是一个人的列表,所以这应该是可行的
public List<People> Objects = new List<People>();
protected void Page_Load(object sender, EventArgs e)
{
Objects = (List<People>) HttpContext.Current.Items["Objects"];
}
public List Objects=new List();
受保护的无效页面加载(对象发送方、事件参数e)
{
Objects=(List)HttpContext.Current.Items[“Objects”];
}
我已编辑了您的标题。请参见“”,其中的共识是“不,他们不应该”。为什么不在整个过程中使用Main.People
?@garrisonely,因为我正在向此控件发送不同类型的对象列表。People
是对象
,而列表
不是列表
@TimSchmelter感谢这个链接,它对这个概念有很好的解释。即使人
继承了MyBaseClass
,你也不能将列表
转换为列表
。
List<MyBaseClass> Objects
public List<People> Objects = new List<People>();
protected void Page_Load(object sender, EventArgs e)
{
Objects = (List<People>) HttpContext.Current.Items["Objects"];
}