0

我有以下代码:

foreach (SPListItem item in list.Items)
{

    string itemId = item.ID.ToString();
    string contentType = item.ContentType.ToString();
    string displayName = item.DisplayName;
    string name = item.Name;

    // todo: Title not always retreiving? Likely due to folders, needs more handling
    //string title = item["Title"].ToString() ?? null;
    string title = "";

    string url = item.Url;
    string author = item["Created By"].ToString();

    // todo: Checked out files catering
    const string checkedOutBy = "";

    DateTime lastModified = Convert.ToDateTime(item["Modified"]);
    string lastModifiedBy = item["Modified By"].ToString();
    DateTime created = Convert.ToDateTime(item["Created"]);


    query.RecordItems(itemId, contentType,
                        displayName, name,
                        title, url, author,
                        checkedOutBy,
                        lastModified,
                        lastModifiedBy,
                        created,
                        author);
}

我遇到的问题是,在循环 Title 或 ContentType 的某些迭代中会抛出 Nullreferenceexception,但不是在所有迭代中都会抛出。我相信我已经通过以下方式满足了这一点,但我不确定 - 有没有更好的方法?

foreach (SPListItem item in list.Items)
{
    try
    {
        string itemId = item.ID.ToString();
        string contentType = item.ContentType.ToString();
        string displayName = item.DisplayName;
        string name = item.Name;

        // todo: Title not always retreiving? Likely due to folders, needs more handling
        //string title = item["Title"].ToString() ?? null;
        string title = "";

        string url = item.Url;
        string author = item["Created By"].ToString();

        // todo: Checked out files catering
        const string checkedOutBy = "";

        DateTime lastModified = Convert.ToDateTime(item["Modified"]);
        string lastModifiedBy = item["Modified By"].ToString();
        DateTime created = Convert.ToDateTime(item["Created"]);


        query.RecordItems(itemId, contentType,
                            displayName, name,
                            title, url, author,
                            checkedOutBy,
                            lastModified,
                            lastModifiedBy,
                            created,
                            author);
    }
    catch (NullReferenceException ex)
    {
        Logger.Error("[{0}] Filed moving on file {1} as not all content was present", item.Name);
    }

}
4

2 回答 2

2

希望我真的理解这里的问题,所以为什么不只是..

foreach (SPListItem item in list.Items)
{
   ...... 
   if(title == null || item.ContentType == null) 
       continue;


   ....
}

如果这不是您要的,请澄清。

于 2013-09-30T06:36:18.020 回答
1

您可以过滤项目并将它们循环如下

list = list.Items.Where(i=> i.ContentType !=null && i["Title"] !=null).ToList();

如果您不需要执行上述所有验证和过滤器,则最好转到for loop

for (int i = 0; i < list.Items.Count; i++)
{
    try
    {
       SPListItem item = list.Items[i];
       // your code 
    }
    catch (NullReferenceException ex)
    {
        Logger.Error("[{0}] Filed moving on file {1} as not all content was present", item.Name);
    }

}
于 2013-09-30T06:42:38.697 回答