c# - 如何在A的类中引用对象A?

时间:2012-12-05 03:08:47

标签: c# asp.net

在我的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;

但这没效果......

3 个答案:

答案 0 :(得分:3)

事实上,您在static函数中使用了currentthis无法正常工作。 static是一种与该类的任何实例无关的方法,因此您无法使用this

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

据我所知,你正试图创建一个“Singleton Pattern”。有关如何创建单例类的示例,请参阅上一篇MSDN文章的链接。

答案 1 :(得分:3)

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

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

答案 2 :(得分: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代码可能遇到的问题是它在生命周期中被调用太晚,这就是您的引用调用无效的原因。