C# 在事件接收器中通过多种方式获取SPListItem有何用途?

C# 在事件接收器中通过多种方式获取SPListItem有何用途?,c#,sharepoint,sharepoint-2007,wss-3.0,C#,Sharepoint,Sharepoint 2007,Wss 3.0,我正在一个定制的事件接收器中工作,该接收器大约是6年前开发的。。。没有源代码,所以我们必须反映生产程序集,并在工作之前清理它 在代码中,我遇到了这一点,我不知道为什么会这样做,我对SharePoint的了解也不够,无法知道是否有这样做的原因,或者最初的代码编写者是否是个白痴(两者都有可能…) 似乎这是通过多种方式获取SPListItem,当它在properties对象中传递时。。。网站也是如此。。因此,我想我的问题是,既然他们最终只是通过列表中的属性获取列表项,那么是否真的有理由通过所有其他检查

我正在一个定制的事件接收器中工作,该接收器大约是6年前开发的。。。没有源代码,所以我们必须反映生产程序集,并在工作之前清理它

在代码中,我遇到了这一点,我不知道为什么会这样做,我对SharePoint的了解也不够,无法知道是否有这样做的原因,或者最初的代码编写者是否是个白痴(两者都有可能…)


似乎这是通过多种方式获取SPListItem,当它在
properties
对象中传递时。。。网站也是如此。。因此,我想我的问题是,既然他们最终只是通过列表中的属性获取列表项,那么是否真的有理由通过所有其他检查/方法最终丢弃该值?

区别在于,它不是使用当前用户的凭据获取列表项;它使用系统帐户的凭据抓取它

系统帐户可能对当前用户没有的列表项具有权限


也就是说,获取列表项肯定有更简单的方法,而且没有理由多次这样获取列表项,即使获取一次可能是合适的。

是的,我看到它在那里进行模拟,但并不认为所有的来回都是必要的。。你能推荐一种更好的方法吗?@tostringtheory这里显示的两个选项中的任何一个都没有问题。只需选择一个并移除另一个。好的。你说“有更简单的方法来获取列表项…”-我正在检查上面的代码中是否有不存在的内容。我想我可以删除其中一个,但是有没有代码中没有的更好的东西?@tostringtheory关于唯一的另一件事是我会避免打开两个网络。只需使用
SPSecurity.RunWithElevatedPrivilages
打开一次常规web即可。
public override void ItemAdded(SPItemEventProperties properties)
{
    Trace.WriteLine("ItemAdded() invoked.");
    base.DisableEventFiring();
    base.ItemAdded(properties);

    try
    {
        SPContext context = SPContext.GetContext(properties.OpenWeb());
        SPUserToken userToken = context.Site.SystemAccount.UserToken;

        using (SPSite site = new SPSite(context.Site.ID, userToken))
        using (SPWeb web = site.OpenWeb(context.Web.ID))
        {
            SPListItem listItem = null;
            try
            {
                listItem = web.GetListItem(properties.ListItem.Url);
                web.AllowUnsafeUpdates = true;
            }
            catch
            {
                Trace.WriteLine("No Url properties, we must be running in CLI mode. Exiting...");
            }
            if (listItem != null)
            {
                SPList parentList = listItem.ParentList;
                listItem = parentList.GetItemById(properties.ListItemId);
            }
            ...
        }
    }
    catch (Exception ex)
    {
        Trace.WriteLine(ex.ToString());
    }
    finally
    {
        base.EnableEventFiring();
    }
}