C# 正在解决Windows phone 8.1编译错误:GetENumerator

C# 正在解决Windows phone 8.1编译错误:GetENumerator,c#,casting,windows-phone-8.1,C#,Casting,Windows Phone 8.1,我正在使用windows phone 8.1中的onNavigate方法,并试图传递我创建的导航对象列表。当我尝试从e.parameters中检索列表时(这似乎有效),我无法遍历列表并将其转换回原始对象类型。如果我只发送一个对象而不是一个列表,它就会工作 比如说 通过主页上的按钮点击事件,我调用下面的代码导航到第2页并传递对象列表 我有一个定义如下的类。 class NavigationContext { public int ID { get; set; } public

我正在使用windows phone 8.1中的onNavigate方法,并试图传递我创建的导航对象列表。当我尝试从e.parameters中检索列表时(这似乎有效),我无法遍历列表并将其转换回原始对象类型。如果我只发送一个对象而不是一个列表,它就会工作

比如说

通过主页上的按钮点击事件,我调用下面的代码导航到第2页并传递对象列表

我有一个定义如下的类。

class NavigationContext 
{
    public int ID { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }
}
对于测试,我创建了3个对象,并将其添加到列表中,如下所示

  NavigationContext navobj = new NavigationContext(){ID = 77,Name = "DN",  Description = "TD1"};

  NavigationContext navobj2 = new NavigationContext(){ID = 22,Name = "JN",Description = "JD1"};

  NavigationContext navobj3 = new NavigationContext(){ID = 22,Name = "CN",Description = "CN1"};
然后我创建如下列表

    List<NavigationContext> navlist = new List<NavigationContext>(){navobj,navobj2,navobj3};
    Frame.Navigate(typeof(Page2), navlist);
如果我传递一个对象,代码就会运行并编译,新页面的导航也会非常成功* **如果我像上面那样传递一个列表,那么在OnNavigatedTo方法中的foreach迭代器上会出现以下错误

**下面是示例代码*

 string myfiller = "";

foreach (NavigationContext navobj in e.Parameter)
{
myfiller += navobj.ID.ToString() + "  " + navobj.Name + "  " + navobj.Description+ "\n";
}
我得到以下错误: foreach语句无法对“object”类型的变量进行操作,因为“object”不包含GetENumerator的公共定义

我试图找到将列表转换回NavigationContext对象的方法,但我认为我做了一些愚蠢的事情,因为我无法让它工作

有什么建议吗?

试试这个:

List<NavigationContext> navigationObjects = e.Parameter as List<NavigationContext>;
if(null != navigationObjects)
{
    foreach (NavigationContext navobj in navigationObjects)
    {
        myfiller += navobj.ID.ToString() + "  " + navobj.Name + "  " + navobj.Description+ "\n";
    }
}
List navigationObjects=e.参数为List;
if(null!=导航对象)
{
foreach(NavigationObject中的NavigationContext navobj)
{
myfiller+=navobj.ID.ToString()+“”+navobj.Name+“”+navobj.Description+“\n”;
}
}

请注意,如果e.参数对象不能解释为正确的类型(a
列表
)然后使用
as
运算符将产生一个
null
值,当您尝试将列表中的元素用作
NavigationContext
对象时,可以测试该值以防止出现进一步的问题。

您的问题在错误消息中是正确的:
e.Parameter
是一个
对象,但您希望对其进行迭代,因此,将其转换为迭代的内容。在google上搜索准确的错误消息会产生以下结果:显示更多的努力,并在错误消息上搜索,它会准确地告诉您错误所在
NULL
不会编译。使其
null
。在我看来,如果你的对象等于零,那么最好表达出来,因为这听起来更符合逻辑
if(navigationObjects!=null)
@Silvermind编辑的答案,感谢您指出这一点。顺序在C#中没有多大区别,但在左边放置一个不可变项有助于减少意外在条件语句中赋值的可能性。(我不知道你是否能在C中做到这一点,但在C中这种情况经常发生。)谢谢。我不知道如何将列表转换回对象。现在我知道了。@Mikeofst我不知道C,但如果你在C#中犯了这个错误,它将导致编译器错误,因为它不会计算为布尔值。