1

我对以下代码有问题。它使用 Facebook c# SDK。问题是我正在提取并打印我所有朋友工作历史的列表。但是,当这些数据不可用时,我认为它会导致 NullReferenceException。我在网上查看了一堆解决方案,但没有找到一个似乎有效的解决方案。任何帮助,将不胜感激。

public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        var accessToken = "...";
        var client = new FacebookClient(accessToken);
        dynamic myInfo = client.Get("me/friends", new { fields = "name,id,work" });

        foreach (dynamic friend in myInfo)
        {
            foreach (dynamic work in myInfo.work) // <---- here
            {
                Response.Write("Employer: " + work.employer.name + "<br/> Position:" + work.position.name + "<br/><br/>");
            }
        }
    }
}

我已经包含了建议的编辑,但现在出现了一个不同的错误:

    namespace WebApplication1.Site
 {
public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {


        var accessToken = "xxx";
        var client = new FacebookClient(accessToken);
        dynamic myInfo = client.Get("me/friends", new { fields = "name,id,work" });

        foreach (dynamic friend in myInfo)
        {
            **foreach (dynamic work in friend.work ?? new[] { new { employer = new { name = string.Empty }, position = new { name = string.Empty } } })**
                {
                    Response.Write("Employer: " + myInfo.work.employer.name);
                }

        }


    }
}
}

“System.Collections.Generic.KeyValuePair”在第 21 行不包含“work”的定义

4

3 回答 3

1

您可以提供一个空列表来代替空值以避免空引用异常:

 foreach (dynamic work in friend.work ?? new List<string>())

您收到异常是因为 foreach 对空值调用 .GetEnumerator() 。我使用了一个新列表,但是放在这里的内容并不重要。只要它不为空并且是可枚举的。

编辑

您可以提供一个匿名类型来提供您需要的属性:

 foreach (dynamic work in friend.work ?? new [] { new { employer = new { name = string.Empty}, position = new { name = string.Empty }}})
于 2012-08-03T19:15:26.300 回答
0

只需在启动内部循环之前测试 myInfo.work 是否为 null:

if (myInfo.work != null) {
   foreach (dynamic work in myInfo.work)

另外,我刚刚注意到您可能使用了错误的对象:

if (friend.work != null) {
   foreach (dynamic work in friend.work)
于 2012-08-03T19:12:42.150 回答
0

我不熟悉 API,但我猜在您的内部循环中,您可能意味着迭代在外部循环中创建的对象的属性。

例如:

foreach (dynamic friend in myInfo)
{
    foreach (dynamic work in friend.work) // rather than myInfo.work
    {
        // ...
    }
}

您还应该对内部循环进行空检查,以防止空引用异常。

于 2012-08-03T19:15:06.190 回答