0

在我的 SharePoint 2010 c# / asp.net 站点中,我定义了一个类

namespace PDF_Library.VisualWebPart1
{
    public partial class PDF_Library : Usercontrol   
    {
         public static PDF_Library current;
         protected void Page_Load(object sender, EventArgs e)
         {
              current = (PDF_Library)this; 
         }
    }
}


public static class Page_State
{
    public static Page is_display()
    {
        return PDF_Library.current.Page; // didn't work...
    }
}

它没有构造函数。我怎样才能得到参考the current instance of this class

我在顶部尝试过这样的事情

public static PDF_Library current;

然后在一个函数中

current = (PDF_Library)this;

但这没有用...

4

3 回答 3

3

事实是,您static在 assingingcurrent中使用的功能this不起作用。static是一种不绑定到类的任何实例的方法,因此您不能使用this.

您唯一的选择是使方法成为非静态方法或将类的实例作为参数传递给静态函数。

据我所知,您正在尝试创建“单例模式”。有关如何创建单例类的示例,请参阅上一篇 MSDN 文章的链接。

于 2012-12-05T03:15:21.150 回答
3

您需要了解它不是以这种方式工作的。您的问题被标记为 asp.net - 多用户、多线程环境,PDF_Library将始终创建多个用户控件实例。绝对不确定他们中的哪一个会挂掉PDF_Library.current。你需要重新考虑你的设计。

更多关于这一点:Page实例在请求处理完成时被处置。通常,此实例及其所有控件和诸如ResponseRequestContext内容将被设置为垃圾收集。因为您UserControl在静态字段中保留对实例的引用,所以所有这些对象(包括Page)都将保留在内存中,直到此current引用被其他内容替换。

于 2012-12-05T03:26:21.110 回答
1

看起来它将有一个实例。如果该类被标记为静态(它似乎不是),那么您可以通过名称“PDF_Library”来引用它。否则,使用 ILSpy 或反射器查看最终结果。我敢打赌它有一个构造函数;仅仅因为你没有看到一个,并不意味着它不存在。覆盖默认 ctor 并在那里设置您的实例。

namespace PDF_Library.VisualWebPart1
{
    public partial class PDF_Library : Usercontrol   
    {
        public static PDF_Library Current;
        public PDF_Library() : base() {
           Current = this;
        }

    }
}

您的 Page_Load 代码可能遇到的问题是它在生命周期中被调用得太晚,这就是您的引用调用不起作用的原因。

于 2012-12-05T03:18:58.910 回答