我有一个通用IEnumerable,其中包含我的数据列表。我需要尝试访问数据以将其中的一些放入对象中。
IEnumerable myData = DynamicDataBuilder.GetDataList(dataSetData);
ObservableCollection<Pages> myPages = new ObservableCollection<Pages>();
foreach (object item in myData)
{
Pages myPage = new Pages
{
ID = ??????
};
}
我无法将myData转换为ObservableCollection,因为并非myData中的所有数据都是Pages类型。 我试过了 ID = item.Id - 项目。仅显示'ToString','Equals','GetHashCode'和'GetType' ID = item [“Id”] - 获取错误
非常感谢任何帮助
这里的参考是GetDataList方法:
public static IEnumerable GetDataList(DataSetData data)
{
if (data.Tables.Count() == 0)
return null;
DataTableInfo tableInfo = data.Tables[0];
System.Type dataType = BuildDataObjectType(tableInfo.Columns, "MyDataObject");
//ObservableCollection<DataObject> l = new ObservableCollection<DataObject>();
var listType = typeof(ObservableCollection<>).MakeGenericType(new[] { dataType });
var list = Activator.CreateInstance(listType);
XDocument xd = XDocument.Parse(data.DataXML);
var table = from row in xd.Descendants(tableInfo.TableName)
select row.Elements().ToDictionary(r => r.Name, r => r.Value);
foreach (var r in table)
{
var rowData = Activator.CreateInstance(dataType) as DataObject;
if (rowData != null)
{
foreach (DataColumnInfo col in tableInfo.Columns)
{
if (r.ContainsKey(col.ColumnName) && col.DataTypeName != typeof(System.Byte[]).FullName && col.DataTypeName != typeof(System.Guid).FullName)
rowData.SetFieldValue(col.ColumnName, r[col.ColumnName], true);
}
}
listType.GetMethod("Add").Invoke(list, new[] { rowData });
}
ObservableCollection<DataObject> l = list as ObservableCollection<DataObject>;
return list as IEnumerable;
}
答案 0 :(得分:2)
使用OfType
扩展方法
IEnumerable myData = DynamicDataBuilder.GetDataList(dataSetData);
IEnumerable<Page> PageCollection = myData.OfType<Page>();
现在,您应该可以从强类型ObservableCollection<Page>
对象中创建PageCollection
ObservableCollection<Pages> myPages
= new ObservableCollection<Pages>(PageCollection);
答案 1 :(得分:1)
我不确定我是否完全了解你,但我想我会尝试类似......
IEnumerable myData = DynamicDataBuilder.GetDataList(dataSetData);
ObservableCollection<Pages> myPages = new ObservableCollection<Pages>();
foreach (var item in myData)
{
MyExpectedDataType data = item as MyExpectedDataType;
If(data != null)
{
Pages myPage = new Pages
{
ID = data.Id
};
MyPages.Add(myPage);
}
}
答案 2 :(得分:0)
IEnumerable myData = DynamicDataBuilder.GetDataList(dataSetData);
ObservableCollection<Pages> myPages = new ObservableCollection<Pages>();
foreach (MyType item in myData) {
// ...
您可以将所需类型放在foreach
构造中。或者使用OfType
扩展,正如亚当所说,在.NET 3.5 +
答案 3 :(得分:0)
嗯,这是因为item
循环中的foreach
来自object
类型。
foreach (object item in myData)
只需将其替换为var关键字或使用实际类型
foreach (var item in myData)
祝你好运!