我有一个 ASP.NET 4.5 应用程序,它使用了数据绑定的 Telerik 多列组合框。
我遇到的问题是,它没有像普通 Telerik 组合框或 asp.net 组合框那样的有效项目数组,而是必须从类型为
object
的 DataSource 属性中检索数据。
给出以下初始化:
class bob
{
Guid id { get; set; }
String name { get; set; }
String tel { get; set; }
}
List<bob> bobarray = .... // some data
MyCombo.DataSource = bobarray;
MyCombo.DataBind();
我无法将
MyCombo.DataSource
投射回 List<bob>
。 相反,我得到一个匿名类型 <>f_AnonymouseType12
3[[System.Guid, System.String, System.String`
我可以将数据源转换为
IEnumerable<object>
,但我无法访问各个属性或将其转换回其原始类型 List<bob>
。
var bobarray = ((IEnumerable<object>)MyCombo.DataSource).ToList();
但是
bobarray
仍然是 List<object>
类型,尝试转换为 List<bob>
或 IEnumerable<bob>
会抛出异常“指定的转换无效”。
我想要做的是在多列下拉列表中搜索具有匹配 id 的项目,然后使用其索引 (
bobarray.FindIndex()
) 将找到的项目设置为选定状态。
如果我这样做
bobarray[0].ToString();
,那么我可以看到带有值的匿名类型属性(id、name、tel),但它是字符串而不是类型。
有谁知道如何正确转换项目,或者在 ASP.NET 4.5 中的 Telerik radmulticolumncombobox 中找到项目的索引?
为了回答我自己的问题,我最终编写了一个使用反射的扩展方法。 它对目标和源采用两种类型(T 和 S),然后仅复制具有相同名称的属性(sourceProp.GetValue() 和 targetProp.SetValue())。
我还必须检查来源是否为 IEnumerable。