通用IEnumerable

时间:2011-03-31 14:55:35

标签: c# silverlight

我有一个通用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;
    }

4 个答案:

答案 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)
祝你好运!