我无法在foreach循环中读取IEnumerable项

时间:2013-11-20 04:12:13

标签: c# asp.net generics ienumerable

我正在尝试构建一个事件日历,我在C#中从XML文件中获取日期/事件

我正在通过以下方式加载我的xml文档:

XDocument myEventsDocument = XDocument.Load(Server.MapPath("Events.xml"));

然后我将事件存储在变量中:

 var resultSet = from p in myEventsDocument.Descendants("event")
                    select new
                    {
                        eventName = p.Attribute("title").Value,
                        eventVenue = p.Attribute("venue").Value,
                        eventDate = p.Attribute("date").Value,
                        eventTime = p.Attribute("time").Value,
                        eventDuration = p.Attribute("LengthOfEventInMts").Value
                    };

然后我缓存了整个结果:

 Cache.Insert("eventsCache", resultSet, new CacheDependency(Server.MapPath("Events.xml")));

在Calendar类的DayRender事件中,我将缓存结果存储在IEnumeration的非泛型集合中:

IEnumerable itemCache = (IEnumerable)Cache["eventsCache"];

当我遍历itemCache中的项目时,我没有看到intellisense中的项目,但是当我在调试时跳过,我看到了IEnumerable项目。

screen shot in the code-behind

Here is the screen shot while stepping-through the code:

请帮我解决我的错误。

2 个答案:

答案 0 :(得分:2)

您需要创建一个简单的类来访问成员。

public sealed class EventInfo
{
    public string Name { get; set; }
    public string Venue { get; set; }
    public string Date { get; set; }
    public string Time { get; set; }
    public string Duration { get; set; }
}

然后你必须评估查询。

var results = query.ToList().AsReadOnly();
Cache.Insert("eventsCache", results, 
    new CacheDependency(Server.MapPath("Events.xml")));

您需要将结果转换为正确的类型。

var itemCache = (IEnumerable<EventInfo>)Cache["eventsCache"];

答案 1 :(得分:1)

IEnumerable<T>不同,IEnumerable接口不会假设枚举的项目属于任何特定类型,因此就intellisense而言,myItem的类型为object }。我看到有两个选项:

  1. 使用命名类型而不是匿名类型:

    public class MyCacheItem { ... }
    
    var resultSet = 
        from p in myEventsDocument.Descendants("event")
        select new MyCacheItem { ... }
    
    IEnumerable<MyCacheItem> itemCache = (IEnumerable<MyCacheItem>)Cache["eventCache"];
    
  2. 使用dynamic迭代集合。这不会给你智能感知,但它会允许你的代码编译:

    foreach(dynamic myItem in itemCache)
    {
        ...
    }